何らかの理由(エラーなど)でコマンドが終了するたびにコマンドを再実行し続ける簡単な方法を見つけようとしています。
これにアプローチする最良の方法は何でしょうか?
編集:私は前に十分に明確ではなかった。前の実行が終了するまで、次の実行を待つ必要があります。
編集2:ほとんどすべての答えがうまく機能します。私は、ほとんどの答えがプロセスを分岐するか、一度だけ再実行するかのいずれかが間違っていると思っていました。
何らかの理由(エラーなど)でコマンドが終了するたびにコマンドを再実行し続ける簡単な方法を見つけようとしています。
これにアプローチする最良の方法は何でしょうか?
編集:私は前に十分に明確ではなかった。前の実行が終了するまで、次の実行を待つ必要があります。
編集2:ほとんどすべての答えがうまく機能します。私は、ほとんどの答えがプロセスを分岐するか、一度だけ再実行するかのいずれかが間違っていると思っていました。
回答:
これにより、無限ループが作成され、繰り返し実行さcommand
れます。
while :
do
command
done
while true; do echo 'Hit CTRL+C'; sleep 1; done
、cyberciti.biz
watch
コマンドは、指定した間隔で永遠にコマンドを繰り返します。
watch -n0 <command>
-n
ゼロに設定すると、間隔は事実上ゼロになります(実際には.1秒だと思います)。
watch
また、出力を調整して視覚的な変更を簡単に確認できるという利点があり、前回の実行からの変更を強調表示するスイッチがあります。
watchはコマンドを繰り返し実行し、その出力を表示します(最初の画面いっぱい)。これにより、プログラム出力の経時変化を見ることができます。デフォルトでは、プログラムは2秒ごとに実行されます。-nまたは--intervalを使用して、異なる間隔を指定します。
監視は中断されるまで実行されます。
watch ls
ファイルを含むディレクトリで実行しても、何も得られないと言っていますか?
簡単な解決策は次のとおりです。
yourcommand; !#
;
コマンドを分離し、1行に複数のコマンドを許可します(Bash:Lists)
!#
bashに「これまでにこの行で書いたすべてを繰り返す」ように指示します(Bash:Event-Designators)
yourcommand; !!
同じ行のコマンドで実際に動作しないので、それがうまくいく!#
ようです。乾杯!
; !#
ZSHで動作しませんでした。基本的にそれを複製するステートメントを拡張するだけで、トリガーしません
コマンド実行中に事前に計画を立てて(インタラクティブでない場合)!!
、前のコマンドを再度実行するコマンドを入力できます。これは、例えばの間に機能しping -c 5
ます。
以下で関数を定義することもできますbash
。
function repeat { "$@"; "$@"; }
永続化するには、に保存し~/.bashrc
ます。
その後、次のようにコマンドを実行できます。
repeat ping -c5 heise.de
それはあなたが繰り返し(例えばなく実行したい特定のコマンドの場合は任意のコマンドを)、あなたは置き換えることができ"$@"
、あなたの実際のコマンドでそのスニペットに、関数などに名前を付けるrepeat_ping
代わりに。
無限ループにするために、@ Dennisが提案することを実行できます。次のように対話型シェルでこれを使用する場合は、待機期間を追加することをお勧めします。
function repeat { while 1 ; do "$@" ; sleep 1 ; done; }
それ以外の場合、を使用してこの無限ループを中止するのはかなり不便Ctrl-Z
です。
while
ループに次のようなブール条件を与えます。
#!/bin/bash
while true; do
do_something && wait
done
これは、bashがプロセスを終了する信号を受け取るまで繰り返し実行されます。通常の形式ctrl+c
。
このwatch
コマンドを使用して、スクリプトを繰り返し実行することもできます。たとえば、使用しているbashターミナルの単純な時計は次のwatch
ようになります。
$ watch -t -n1 date +%T
この-t
オプションはwatch
、実行中のプロセスのタイトルを表示しないように指示します。これにより、繰り返されているコマンドのみのクリーンな出力が得られます。この-n1
オプションは、ウォッチに1 n
秒ごとに繰り返すよう指示します。この場合、秒の-n1
間隔になります1
。その後、date +%T
コマンドはコマンド完了時の時刻を表示します。このコマンドを実行すると、ターミナルにアクティブなクロックが表示されます。
そして、他の答えのいずれにも含まれていないもう1つのメソッドは、無限関数呼び出しです。
do_something() { do_something }; do_something && wait
これは基本的に、while
再帰的な関数呼び出しのみを使用するブールループと同じです。
(編集)マシンのリソースを念頭に置いて、&& wait
プロセスが実行されるたびに、次の反復の前にプロセスが終了ステータス0で終了するまでループが「待機」するように追加しました。これは、対話型のシェルスクリプトで役立ちます。
while
ループの例がありますが、ブールtrue
構文を使用していません。watch
例はありますが、多くの便利な構文を提供していません。私は、それが役立つかもしれない人のために、これらについて説明しています。これらに実用的な有用性を与えたいと思いました。while
ループブールも可能false
と虚偽の条件が満たされるまで実行されません。とても便利です。
if
再実行を続けるにはどうすればよいですか?
これは、bashでコマンドを繰り返すために使用するもう1つの方法です。これは、スクリプトの作成を必要とせず、多くの人に知られている可能性があるため、一部には愚かに聞こえるかもしれません。しかし、覚えておくべき構文があまりないという意味で、迅速で初心者に優しいので、言及する価値があると思います。私はこれをUbuntuのgnome-terminalでのみテストしましたが、他の端末はこれをサポートしていないかもしれません。
各コマンドが終了するまで貼り付けるのを待つ必要はありません。貼り付けられたコマンドはキューに入り、次々に実行されます。