最初の実行を待たずにコマンドを繰り返す

最初の実行を待たずにコマンドを繰り返す

私は主にコマンドラインを使用するためにこれを行うより良い方法が欲しいです。

while sleep 60; do 
  mysql -e 'show processlist'; 
done

これは次のより良いです:

while mysql -e 'show processlist'; do
  sleep 60;
done

...aを入力すると停止するctrl-cためです。ただし、最初のバージョンは最初に出力する前に1分待ちます。

について知っていますwatch。一般的に良いですが、すべての状況に適しているわけではありません。私は呪われずにstdoutで単純な出力を探しています。watchオプションがあればよさそうです--stdout

ここでは単純さが重要です。私はmysql文のエラー処理に興味がありません。独自のエラーを標準出力として報告できます。

答え1

Ctrl+ はC通常の状況でループ全体を終了します。信号は全フォアグラウンドプロセスグループに送信されます。

あなたは探しているかもしれません

while mysql -e 'show processlist' && sleep 60; do :; done

一度終了するmysqlか、sleep失敗すると終了します。

答え2

これはあなたに役立ちます:

trap "pkill -TERM -P $$" SIGINT

while [ 1 ]; do
   mysql -e 'show processlist'
   sleep 60
done

答え3

まあ、あなたの例...

n=; while sleep "$((n&(n=60)))"
do   mysql...
done

...するつもりです。最初にのみ実行し、sleep 0残りの部分でも実行しますsleep 60。それでも最終目標を達成するためには、これより良い方法があると思います。

このようなものを使用する場合は、おそらく関数で使用したいと思います。

every_minute() ( n=
    while sleep "$((n&(n=60)))"
    do "$@"; done)

...または1行で...

every_minute() (n=; while sleep "$((n&(n=60)))"; do "$@"; done)

シェルのrcファイルにこのようなものを置くと、次のようになります。

every_minute mysql "$whatever" "$args" "$you" "$use"

...またはプロンプトで1行のバージョンを入力し、シェルが閉じるまで引き続き使用できます。

関連情報