私はこれをエイプリルフールのいたずらにしようとします。 Linuxボックスに数秒ごとにシェルにメッセージを表示させたいと思います。
私の考えは、バックグラウンドジョブとして実行される無限ループ(.bashrcで)を開始してこれを行うことです。
たとえば、私が望むものは次のとおりです。
while true ; do echo Evil Message; sleep 10; done
バックグラウンドで実行するには、次のことを試しました。
cmd="while true ; do echo Evil Message; sleep 10;"
$cmd &
しかし、これはエラーのため失敗します。
while: command not found
エラーメッセージが表示されるのはなぜですか?このスクリプトを機能させる方法はありますか?
答え1
while
コマンドではなくシェルキーワードです。変数拡張が行われる前にキーワードが認識されるため、拡張後は遅すぎます。
いくつかのオプションがあります。
変数をまったく使用しないでください。
while true ; do echo Evil Message; sleep 10; done &
eval
変数の拡張値に対してシェルを実行するために使用されます。eval "$cmd" &
ループを実行するには、シェルを呼び出します。
bash -c "$cmd" &
関数の使用(通常はコードを保存するために使用されます):
cmd() { while true ; do echo Evil Message; sleep 10; done; } cmd &
答え2
別のオプション(chorobaの答えにリストされているすべての良いオプションに加えて)は、次のようにサブシェルで実行することです。
(while true; do echo Evil Message; sleep 10; done;) &
これにより、bash
コードの他のインスタンスがバックグラウンドで実行されます。