存在する より早い 質問私と同じように、提案された解決策はすべてCtrl+を使用して現在のフォアグラウンドタスクを一時停止しZてから実行するfg && ...
か、または新しいコマンドを入力している間実行を続けるために前のタスクfg ; ...
を最初にバックグラウンドに送信することです。bg
少なくとも私にとっては、これは待機中の単一のコマンドでのみ機能します。このトリックを連続して複数回使用しようとすると、その間にあるコマンドが忘れてしまいます。
$ sleep 60 && echo test1
^Z
[1] + 2336348 suspended sleep 60
$ fg && echo test2
[1] + 2336348 continued sleep 60
^Z
[1] + 2336348 suspended sleep 60
$ fg && echo test3
[1] + 2336348 continued sleep 60
test3
Howはtest1
決して印刷されないことに注意してください。 (これを受け入れることはできますが、最初のコマンドは2つで構成されており、コマンドがsleep 60
完全に実行されるため、これが私が最も重要なことです)test2
。これは私の2番目のコマンドであり、私はそれが実行されたことがないと思います。
私が望むのは、私が他のコマンドが実行されている間に、他のコマンドをキューに追加して、現在のコマンドの後と以前にキューに追加した他のすべてのコマンドの後/前に実行することです。コマンドの順序は最終的に重要ではありませんが、共通の状態(ファイルシステムなど)に依存するため、同時に実行することはできません(それ以外の場合は別のシェルを開いてそこで実行できます)。
ご協力ありがとうございます!
答え1
GNU/Linux システムを使用している場合、または coreutils がインストールされている場合は、以下を使用します。群れ(1)(たぶん実行可能ファイル/コマンド自体をロックファイルとして使用できます):
% cat linger
echo -n $$; date +%s; sleep $1
% flock ./linger ./linger 8 &
[3] 5941
% 59421598557788
% flock ./linger ./linger 9 &
[4] 5945
% flock ./linger ./linger 11 &
[5] 5946
% 59471598557796
59501598557805
[3] Done flock ./linger ./linger 8
[4] Done flock ./linger ./linger 9
[5] Done flock ./linger ./linger 11
シェルでコマンドを停止すると、ゼロ以外(失敗)状態で即座に終了したように見えるため、実行しようとしている操作は機能しません。
% sleep 10 || echo FAIL
^Z
[3]+ Stopped sleep 10
FAIL
% fg
sleep 10
% echo $?
0