返すのに時間がかかるコマンドを実行し、その後別のコマンドを実行したいが、あらかじめ計画を立てることはできないとしましょう。
Ctrl + Zボタンを押した後に送信するオプションがあることがわかりますfg && otherCommand
。しかし、ここには2つの主な欠点があります。
command1 && command2
command1; command2
最初のコミットラインの後続のコマンドは実行されないため、最初のコマンドが他のコマンド(または)の組み合わせである場合、このコマンドは効果がありません。- 次のコマンドを入力すると、最初のコマンドの実行が停止します。これらの面倒な30秒命令の場合、次の命令を入力するのにかかる時間が残りの実行時間のすべてではない場合でも、大部分を占めます。
Enterまた、1つの実行中に次のコマンドを入力して[送信]をクリックできることもわかります。しかし、ここには2つの主な欠点もあります。
- コマンドを最初に実行しても機能しません
stdin
。 - 最初に実行したコマンドが出力を生成した場合、入力した内容は表示されません。
特別な端末エミュレータまたは複数の端末を使用して1つを実行している間に、より多くのコマンドをキューに追加する簡単な方法はありますか?
答え1
Ctrl+を押してZ今すぐ実行しますbg
。これにより、現在のコマンドはバックグラウンドで実行され続けます。これにより、現在時刻以降にfg && otherCommand
スケジュールを使用できます。otherCommand
Ctrlこれをより簡単にするために、空のコマンドラインで+を押すと実行するようにシェルで+を設定しました。バラよりZbg
zshでフォアグラウンドプロセスをすばやく拒否するにはどうすればよいですか?そしてコマンドラインアプリケーションをバックグラウンドで直接送信するにはどうすればよいですか?;最新バージョンのbashが同じ操作を簡単に実行できることを確認していません。
答え2
名前付きパイプを作成できます(これは一度だけ実行する必要があります)。
mkfifo ~/myfifo
その後、ターミナル(ターミナルAと呼びます)で次のように話すことができます。
exec 10< ~/myfifo
パイプの読み取り端をファイル記述子 10 に割り当てるには、2 つ以上の異なる数値を使用できます。したがって、他のコマンドで標準入力、出力、およびエラーが必要な場合は、標準入力、出力、およびエラーを引き続き使用できます。
その後、他の端末(ターミナルBと呼びます)で次のように話すことができます。
cat - > ~/myfifo
ターミナルA接続を完了し、プロンプトに戻ります。このコマンドは、標準入力の入力内容をパイプに書き込みます。その後、端末Aに次のように入力できます。
while read -u10 -r LINE; do eval "$LINE"; done
これにより、ターミナルBに入力したコマンドが実行されます。このread
コマンドは、ファイル記述子10から行を読み取りますeval
。eval
変数のエクスポートなどのシェルコマンドを実行できます。
ターミナルAが開いている間は、Ctrl + Cを使用してコマンドを再入力できるようにループを停止し、ループを再開して待機中の残りのコマンドの実行を開始できます。
execコマンドとwhileコマンドをシェルスクリプトに入れることができるため、 fg && yourscript
最初に忘れた場合は、Ctrl-Zを使用してパイプモードを有効にできます。
答え3
答え4
編集する:質問を誤解しましたが、以下のテクニックは、bashスクリプトでコマンドを実行するときに人々にまだ役に立つかもしれません(したがって、単一のPIDを持ちます)。
これはcommand1が有用な出力を印刷するときに使用します(Linuxで)、操作が完了したら別のシェルで別のプロセスを開始しようとします(つまり、command1をバックグラウンドで実行したくありません)。
tail --pid=$command1_pid -f /dev/null; command2
$command1_pid
完了するのを待っているプロセスのPIDはどこにありますか?
(もともとここで見つけたようです。https://stackoverflow.com/a/41613532/1676393。便利な追加の詳細についてはこちらをご覧ください。例:Darwin用バージョン(macOS))
ステップバイステップ:
- Ctrl+ stopコマンドの使用1Z
- run を実行して
ps
command1 に対応するプロセスを探し、その PID を探します。 - その後、command1プロセスを再起動し、次のように
fg
入力して新しいシェルで上記のコマンドを実行します。
このようにして、command1が古いシェルで完了すると、command2は新しいシェルで起動します。