で端末をエミュレートする必要があり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ターミナルウィンドウがハードウェアであったハードウェアコンピューター端末を介してログインし、有線で接続されていたことに注意してください) )、いわゆるログインシェルが開始されます。
ロジックシェルの主なアイデアは、ユーザーにインタラクティブな環境を提供することです。
しかし、ご存じのとおり、シェルはスクリプトを実行することもできます。シェルがスクリプトを実行すると、非インタラクティブモードで実行されます。
それでは、インタラクティブシェルと非インタラクティブシェルについて、そのことについてさらに詳しく見ていきましょう。
対話モードでは:
bash
、入力されたものを編集するための限られた手段を提供します(たとえば、GNUを使用しreadline
ます)。非インタラクティブモードの場合:
/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]
コメントを追加