
私は長いコマンドのリストをBashに貼り付け、実行中にそれを停止することにしました。 Ctrl+Z と Ctrl+C は何もしません。 1行ずつ実行されます。最後に、このコマンドを実行するにはサービスが必要だったため、サービスを停止して代わりに別のSSHインスタンスを使用しましたが、コマンドは順番に失敗しました。
このタスクを実行するためにサービスを停止できない場合は、リストの継続を停止するにはどうすればよいですか?
答え1
「ではしないでください」と答える質問だ。
これは悪い習慣なので、できるだけ避けるべきです。すでに持っている場合は破ってみてください。それ以外の場合は、自分がしたことの結果を受け入れます。
Ctrl-Cテキストをシェルに貼り付けると、ユーザーが直接入力したかのように入力バッファがそのテキストで埋められ、その後にバッファに入力するキーストロークやその他の項目Ctrl-Zは、バッファの内容が消費されるまで貼り付けられるまで処理されません。 。キューに入って待つ必要があります。
代わりに、コマンドをテキストエディタに貼り付け、必要に応じて編集し、ファイルに保存してスクリプトを実行します。
または、何らかの理由で一時ファイルにスクリプトを保存したくない場合は、シェルのコマンドラインエディタモードを起動し、コマンドをエディタに貼り付けて編集し、保存して終了して実行します。これは、実際にバルクテキストをシェルに貼り付けることによる望ましくない結果を防ぐ方法です。
では、bash
エディタモードが呼び出され、edit-and-execute-command
呼び出しが転送されますCtrl-XCtrl-E。現在の行を編集するために$VISUAL
、$EDITOR
または(順番に)実行を試みるので、emacs
コピー貼り付けだけでなく、履歴の行編集にも便利です。他のいくつかのシェル(例zsh
:)にも同様の機能があります。
答え2
bashからコンソールへの出力を停止するためにCtrl + Sを正常に使用しました。これは、追加のコマンドの実行を防ぐ副作用もあります。たとえば、次のように入力しました。
sleep 5; date; sleep 5; date
それからENTERを押し、すぐにCtrl-Sを押しました。その後、しばらく待ってからCtrl-Qを押し、すぐに盲目的にと入力しdate
てENTERを押しました。
date
Ctrl-Sが出力を停止して1分早く実行したか(非常に近い2つの日付を取得し、3番目の日付は1分間隔で表示されます)、または少なくとも2番目の日付は停止したかどうかがわかります。 1つdate
、その後、約束をつかみ、その後1分間停止した後、非常に近い約束を2つ受け取りました。
私は2番目のものを得ましたが、これは出力が到着するとすぐにCtrl-Sが停止することを証明します。
$ sleep 5; date; sleep 5; date
Tue 07 Dec 2021 11:12:19 PM CET
date <--- this I typed after Ctrl-Q
Tue 07 Dec 2021 11:13:17 PM CET
$ date <--- this is my command echoed
Tue 07 Dec 2021 11:13:17 PM CET
$
ただし、bashが停止した場合は、他の端末で終了する必要があります。