exex(go)を使用してlinux / macOSでターミナルを正しくエミュレートするにはどうすればよいですか?

変態:

で端末をエミュレートする必要がありgoます。私はこのようにしてみます:

lsCmd := exec.Command("bash", "-c", "ls")
lsOut, err := lsCmd.Output()
if err != nil {
    panic(err)
}
fmt.Println(string(lsOut))

そして、それは正しく動作しているようです(ネイティブのubuntu端末は水平方向のリストを表示し、この関数の結果は垂直方向になります)。

しかし、たとえば間違ったコマンドを具体的に呼び出すとexec.Command ("bash", "-c", "lss")、次のようになります。

パニック:終了ステータス127

そしてネイティブのubuntu端末では次の結果が得られます:

コマンド「lss」が見つかりません、もしかして:

およびコマンドの列挙。

標準のubuntu端末でコマンドを記述した場合、ネイティブ端末と通信し、コマンドの結果と同じものを取得する必要があります。

これを行う最良の方法は何ですか?たぶん、execライブラリはこれに適していませんか?これはすべて、OS端末とのフロントエンド通信に必要です。単純なhtml/css/jsページで、ユーザーがコマンドを入力するgoと、オペレーティングシステムのネイティブターミナルにコマンドが送信され、その結果がフロントエンドに返されます。

ネイティブターミナルで作業しているかのようにコマンドを実行した場合と同じ結果を得るにはどうすればよいですか?

費用:

問題

しかし、例えばexec.Command( "bash"、 "-c"、 "lss")のように、特に間違ったコマンドを呼び出すと、次のようになります。

panic: exit status 127

そしてネイティブのubuntu端末では次の結果が得られます:

Command 'lss' not found, did you mean:

およびコマンドの列挙。

これはGoとは関係がなく、問題は実際には2つあります。

  • Ubuntuにcommand-not-foundは、通常プリインストールされている特別なパッケージが同梱されています。このパッケージは、次の2つの手法を採用することで、単なる一般ユーザー向けに端末をより効率的にしようとします。

    • スペルミス(あなたのケース)の修正を提案しようとします。
    • ユーザーが特定のパッケージをインストールしていた場合に利用可能であったプログラムをユーザーが実行しようとしたときに、インストールするパッケージを提案しようとします。
  • コマンドが見つからない場合、「プレーン」(下記を参照)シェルは、ゼロ以外の終了コードを返すことにより、試行に失敗します。
    これは絶対に予想されることであり、正常です。つまり、慌てることはまったく賢明ではありません。

  • Unixシステムでのシェルの実行方法には歴史的な違いがあります。

    ユーザーがシステムにログインすると(シェルの概念が発明された当時は、基本的にはGNOMEターミナルウィンドウがハードウェアであったハードウェアコンピューター端末介してログインし、有線で接続されていたことに注意してください) )、いわゆるログインシェルが開始さます
    ロジックシェルの主なアイデアは、ユーザーにインタラクティブな環境を提供することです。

    しかし、ご存じのとおり、シェルはスクリプトを実行することもできます。シェルがスクリプトを実行すると、非インタラクティブモードで実行されます。

Unixシェルが動作できるモード

それでは、インタラクティブシェルと非インタラクティブシェルについて、そのことについてさらに詳しく見ていきましょう。

  • 対話モードでは:

    • シェルは通常、実際のターミナル(hadrwareまたはターミナルエミュレーターのいずれかに接続されています。GNOME ターミナルウィンドウはターミナルエミュレーターです)。
      「接続されている」とは、シェルの標準I / Oストリームが端末に接続されているため、シェルが出力した内容が端末に表示されることを意味します。
    • これは、ユーザーに特定の機能を提供します。通常bash入力されたものを編集するための限られた手段を提供します(たとえば、GNUを使用しreadlineます)。
  • 非インタラクティブモードの場合:

    • シェルの標準I / Oストリームは、いくつかのファイル(または「nowhere」-のような/dev/null)に接続されています
    • ベルとホイッスルは有効化されていません—それらを利用する人がいないためです。

GNU bashは両方のモードで実行でき、どのモードで実行されるかは、起動方法によって異なります

さまざまなモードで初期化する場合、さまざまbash な初期化スクリプトを読み取ります。これにより、command-not-foundパッケージから提供される機構がインタラクティブモードになり、Goからの呼び出しのようにbashが実行されない場合に、その理由がわかりません。

問題に対して何をしますか

試す最も簡単なことは、--loginコマンドラインオプションを指定してbashを実行するか、そうでなければインタラクティブシェルとして実行されるようにさせることです。

これはあなたのケースの問題を解決するかもしれませんが、必ずしもそうではありません。
次に考えられる問題は、一部のプログラムが端末で実行されているかどうかを実際に確認することです。通常、これらは通常セキュリティ上の目的でユーザーとの実際の対話を要求するプログラムであり、接続していないと実行できないプログラムがあります実際の端末—これらは、GNU Midnight Commander、Vim、Emacs、GNU Nanoなどの「フルスクリーン」テキストUIプログラムであり、このようなものです。

この問題を解決するための唯一の解決策は、疑似端末環境でシェルを実行することです。これは、@ eudoreがコメントで示唆したことです。
これgithub.com/creack/ptyは検討を始めるためのパッケージかもしれません。golang.org/x/crypto/sshまた、PTYを処理するための手段も提供します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MinGW / MSYSのターミナルエミュレータとしてminttyを使用するにはどうすればよいですか?

分類Dev

Python Paramikoでターミナルエミュレーションなしでシェルを起動するにはどうすればよいですか?

分類Dev

ターミナルエミュレートキーボードショートカットを変更するにはどうすればよいですか?

分類Dev

Windows(cmd)でデフォルトのターミナルエミュレータを変更するにはどうすればよいですか?

分類Dev

ターミナルエミュレータをtmuxからリセットするにはどうすればよいですか?

分類Dev

現在使用されているターミナルエミュレータを確認するにはどうすればよいですか?

分類Dev

Firebaseエミュレーターpubsubを使用して、時限関数をローカルでテストするにはどうすればよいですか?

分類Dev

設定エディターとして使用しているときに、ターミナルでemacsを開くにはどうすればよいですか?

分類Dev

AndroidStudioなしでAndroidエミュレーターを作成するにはどうすればよいですか?

分類Dev

GnomeターミナルエミュレータアプリのTERM環境変数を設定するにはどうすればよいですか?

分類Dev

ターミナルエミュレータの背景の背景色を変更するにはどうすればよいですか?

分類Dev

GnomeターミナルエミュレータアプリのTERM環境変数を設定するにはどうすればよいですか?

分類Dev

ターミナルを使用してエミュレータにGooglePlayストアをインストールするにはどうすればよいですか?

分類Dev

エミュレーター(ルートなし)でネットワーク速度を制限するにはどうすればよいですか?

分類Dev

bashプロンプトの016017は何ですか、ターミナルで正しくするにはどうすればよいですか?

分類Dev

Ubuntuでデフォルトの「ターミナルエミュレータ」を使用してアプリケーションを起動するにはどうすればよいですか?

分類Dev

アウター+リストをエミュレートするにはどうすればよいですか?

分類Dev

通常のターミナルではなくGuakeターミナルでスクリプトを実行するにはどうすればよいですか?

分類Dev

ターミナルプログラムを介してキーストロークを送信することをエミュレートするにはどうすればよいですか?

分類Dev

ブラウザでjsonデータを使用してRESTPOSTリクエストをシミュレートするにはどうすればよいですか?

分類Dev

QTextEditを使用してシェルのようなスクリプト環境をエミュレートするにはどうすればよいですか?

分類Dev

QTextEditを使用してシェルのようなスクリプト環境をエミュレートするにはどうすればよいですか?

分類Dev

ターミナルエミュレータがデスクトップセッションで実行されているかどうかをスクリプトで検出するにはどうすればよいですか?

分類Dev

Powershellを使用してローカルのAzureStorageエミュレーターに接続するにはどうすればよいですか?

分類Dev

特定のソフトウェアがインストールされているかどうかを確認するためにMSターミナルサービスを使用してエミュレートするにはどうすればよいですか?

分類Dev

キーボードを使用してターミナルエミュレータウィンドウを小さなステップでスクロールするにはどうすればよいですか?

分類Dev

ターミナルを使用してアーカイブからディレクトリに移動するにはどうすればよいですか?

分類Dev

GoでSSHを介してターミナルエスケープシーケンスを送信するにはどうすればよいですか?

分類Dev

ターミナルを使用してMacのドキュメントフォルダに移動するにはどうすればよいですか?

Related 関連記事

  1. 1

    MinGW / MSYSのターミナルエミュレータとしてminttyを使用するにはどうすればよいですか?

  2. 2

    Python Paramikoでターミナルエミュレーションなしでシェルを起動するにはどうすればよいですか?

  3. 3

    ターミナルエミュレートキーボードショートカットを変更するにはどうすればよいですか?

  4. 4

    Windows(cmd)でデフォルトのターミナルエミュレータを変更するにはどうすればよいですか?

  5. 5

    ターミナルエミュレータをtmuxからリセットするにはどうすればよいですか?

  6. 6

    現在使用されているターミナルエミュレータを確認するにはどうすればよいですか?

  7. 7

    Firebaseエミュレーターpubsubを使用して、時限関数をローカルでテストするにはどうすればよいですか?

  8. 8

    設定エディターとして使用しているときに、ターミナルでemacsを開くにはどうすればよいですか?

  9. 9

    AndroidStudioなしでAndroidエミュレーターを作成するにはどうすればよいですか?

  10. 10

    GnomeターミナルエミュレータアプリのTERM環境変数を設定するにはどうすればよいですか?

  11. 11

    ターミナルエミュレータの背景の背景色を変更するにはどうすればよいですか?

  12. 12

    GnomeターミナルエミュレータアプリのTERM環境変数を設定するにはどうすればよいですか?

  13. 13

    ターミナルを使用してエミュレータにGooglePlayストアをインストールするにはどうすればよいですか?

  14. 14

    エミュレーター(ルートなし)でネットワーク速度を制限するにはどうすればよいですか?

  15. 15

    bashプロンプトの016017は何ですか、ターミナルで正しくするにはどうすればよいですか?

  16. 16

    Ubuntuでデフォルトの「ターミナルエミュレータ」を使用してアプリケーションを起動するにはどうすればよいですか?

  17. 17

    アウター+リストをエミュレートするにはどうすればよいですか?

  18. 18

    通常のターミナルではなくGuakeターミナルでスクリプトを実行するにはどうすればよいですか?

  19. 19

    ターミナルプログラムを介してキーストロークを送信することをエミュレートするにはどうすればよいですか?

  20. 20

    ブラウザでjsonデータを使用してRESTPOSTリクエストをシミュレートするにはどうすればよいですか?

  21. 21

    QTextEditを使用してシェルのようなスクリプト環境をエミュレートするにはどうすればよいですか?

  22. 22

    QTextEditを使用してシェルのようなスクリプト環境をエミュレートするにはどうすればよいですか?

  23. 23

    ターミナルエミュレータがデスクトップセッションで実行されているかどうかをスクリプトで検出するにはどうすればよいですか?

  24. 24

    Powershellを使用してローカルのAzureStorageエミュレーターに接続するにはどうすればよいですか?

  25. 25

    特定のソフトウェアがインストールされているかどうかを確認するためにMSターミナルサービスを使用してエミュレートするにはどうすればよいですか?

  26. 26

    キーボードを使用してターミナルエミュレータウィンドウを小さなステップでスクロールするにはどうすればよいですか?

  27. 27

    ターミナルを使用してアーカイブからディレクトリに移動するにはどうすればよいですか?

  28. 28

    GoでSSHを介してターミナルエスケープシーケンスを送信するにはどうすればよいですか?

  29. 29

    ターミナルを使用してMacのドキュメントフォルダに移動するにはどうすればよいですか?

ホットタグ

アーカイブ