中: コマンドが見つかりません

中: コマンドが見つかりません

私はこれをエイプリルフールのいたずらにしようとします。 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コマンドではなくシェルキーワードです。変数拡張が行われる前にキーワードが認識されるため、拡張後は遅すぎます。

いくつかのオプションがあります。

  1. 変数をまったく使用しないでください。

    while true ; do echo Evil Message; sleep 10; done &
    
  2. eval変数の拡張値に対してシェルを実行するために使用されます。

    eval "$cmd" &
    
  3. ループを実行するには、シェルを呼び出します。

    bash -c "$cmd" &
    
  4. 関数の使用(通常はコードを保存するために使用されます):

    cmd() { while true ; do echo Evil Message; sleep 10; done; }
    cmd &
    

答え2

別のオプション(chorobaの答えにリストされているすべての良いオプションに加えて)は、次のようにサブシェルで実行することです。

(while true; do echo Evil Message; sleep 10; done;) &

これにより、bashコードの他のインスタンスがバックグラウンドで実行されます。

関連情報