Bashのコマンドリストの残りをキャンセルするにはどうすればよいですか?


10

Bashでは、たまにコマンドのリストを入力してを押しますEnter、後でリストの最後の方にあるコマンドに誤りがあることに気づきます。Ctrl+ を押すCと、現在実行中のコマンドが終了し、残りのリストがキャンセルされることがわかっています。現在実行中のコマンド終了せずにリストの残りをキャンセルする方法はありますか?

たとえば、次のように入力したとしましょう

foo; bar

または

foo && bar

where fooは、実行を中断しないことが非常に重要である長期実行コマンドであり、bar不可逆的で不要な処理を実行します(たとえば、shutdown -h nowまたはrm -rf /)。fooがまだ実行されている間に、シェルにfoo終了させるがbar後で実行しないように指示する一般的な方法はありますか?(はい、bar実行可能ではないようにアクセス許可を変更することはできますが、それまでの間使用したいbarような場合は特に便利ではrmありません。所有していないbar場合やbar組み込みの場合は機能しません。)


あなたは最後に修正することができますbarにコマンドをsome_command^bar^some_command実行する前に。
GAD3R 2018

3
@ GAD3R:ただし、これは現在の行を変更せず、新しい行を開始します。
Arkadiusz Drabczyk

回答:


3

CtrlZプログラムをバックグラウンドプロセスにシフトするためにを使用すると効果があることがわかりました。

foo && bar

foo; bar必要な方法で制御を与えないコメントでそれを指摘してくれた@Arkadiusz Drabczykに感謝します。

次に:

^Z

[1]+  Stopped                 foo

コマンドは最初のタスクのみを停止し、

fg %1

これにより、タスクのみfooがフォアグラウンドに移動し、タスクが完了して終了します。

PS:これは、ファイルに書き込む2つのスクリプトで確認できます。最初の人は数秒間寝て、元に戻す時間を与えます。

なぜCtrlZコマンドが実行中のコマンドのみを処理し、残りを残すのかが分からなくなりました。知りたいと思います。


1
再現できません。どのbashバージョンを使用していますか?使用しますGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)。異なるファイルに書き込む2つのbashスクリプトを作成しましたwrite1.sh::pastebin.com/rbKmdWgBおよびwrite2.shpastebin.com/bNx3VRws。私はそれらをそのように実行します./write1.sh ; ./write2.sh。最初のスクリプトエコーwrote 1数回のために、Iを押しC-z、それが言う[1]+ Stopped ./write1.shと、私はすぐに2番目のスクリプトの出力を見ることができます:wrote 2繰り返しエコーさ。
Arkadiusz Drabczyk

2
この方法がcommand1 && command2パイプラインで機能する理由は、プロセスにシグナルをControl-z送信するためだと思いSIGCHLDます。で確認できますecho $?Bash次に、最初のプロセスが正常に終了せず、次のプロセスを実行しないことがわかります。
Arkadiusz Drabczyk

使用していGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)ます。ええ、私はあなたが正しいと思います。foo; bar希望どおりに制御することはできません。しかしCtrl+Z、コマンドrunがの場合、2番目のプロセスの必要な停止を実行できますfoo && bar。回答を更新します。ご指摘ありがとうございます。
Revanth Chetluru

@ArkadiuszDrabczykはCtrl-ZでSIGTSTPを送信しませんか?
muru

@RevanthChetluru barはまだ中断されており、jobs出力に表示されるため、おそらく強制終了する必要があることに注意してください。
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.