引数を渡すことで別の期待スクリプトを実行するためのphpスクリプトがあります。
$output = shell_exec("expect login_script.tcl '$user' '$host' '$port' '$password'");
shell_exec の使用は、スクリプトがバックグラウンドまたは php スクリプト内で実行されるため機能しません。ユーザーの対話性を可能にするために、フォアグラウンドで実行する必要があります。これを行うエレガントな方法はありますか。さまざまなスクリプト言語を使用する必要があるため、すでに面倒になっています。php スクリプトを呼び出すシェル スクリプトで 2 つのスクリプトをラップし、結果を変数 (コマンド) として割り当て、それに対して sh を実行してみました。ただし、スクリプトがバックグラウンドで実行され、ユーザーの対話操作によって停止/フリーズが発生するという同じ問題が再び発生します。この状況では、shell exec を呼び出すときに php が「終了」しても問題ありません。すなわち。php が停止し、呼び出されたかのように実行されることを期待します。(出力されたコマンドをコピーして端末に貼り付けた場合と同じです)。
更新 php で次のコマンドを使用すると、はるかにうまくいきます。
shell_exec("gnome-terminal -e 'bash -c \"expect ~/commands/login_script.tcl; exec bash\"' &");
しかし、二次スクリプト(login_script)が終了した直後にシェルを閉じないようにするために、これを改善することはできますか?
更なるアップデート
回答を読んで、人々が「より複雑な」問題を想定しているように見えるので、物事を明確にする必要があると思います。
2 つのプロセスは相互に通信する必要はありません。混乱を招いていると思われるため、
$output = shell_exec
この例にを入れるべきではなく、単独で使用するべきでした。shell_exec
php スクリプトは、いくつかの cli パラメータ (my-script 'param1' 'param2' など) を使用して Expect スクリプトを開始するだけでよく、完全に「非同期」と考えることができます。これは、'launchy' や 'synapse' などのランチャー プログラムの動作によく似ており、他のプログラムを起動できますが、それらに影響を与える必要はありません。また、二次プログラムが終了/終了するのも待ちません。
「shell_exec」が機能しないと言うのは間違いでした。私が言うべきだったのは、「これまでのところ shell_exec の使用に成功していません」が、
shell_exec("gnome-terminal -e 'bash -c \"expect ~/commands/login_script.tcl; exec bash\"' &");
「機能している」が、expect スクリプトに引数を渡すことができる正しい引用符の組み合わせを見つけようとしているということです。