while:找不到命令

Cri*_*scu 7 shell bash quoting

我试图将其作为愚人节的恶作剧:让 linux 机器每隔几秒钟在 shell 中显示一条消息。

我的想法是通过启动一个作为后台作业(在 .bashrc 中)运行的无限循环来实现这一点。

例如,这做我想要的:

while true ; do echo Evil Message; sleep 10; done
Run Code Online (Sandbox Code Playgroud)

为了在后台运行它,我尝试了:

cmd="while true ; do echo Evil Message; sleep 10;"
$cmd &
Run Code Online (Sandbox Code Playgroud)

但这失败并出现错误:

while: command not found
Run Code Online (Sandbox Code Playgroud)

为什么我收到错误?有没有办法让这个脚本工作?

cho*_*oba 17

while不是命令,它是一个 shell 关键字。关键字在变量扩展发生之前被识别,所以在扩展之后,为时已晚。

您有多种选择:

  1. 根本不要使用变量。

    while true ; do echo Evil Message; sleep 10; done &
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用于eval在变量的扩展值上运行 shell

    eval "$cmd" &
    
    Run Code Online (Sandbox Code Playgroud)
  3. 调用一个 shell 来运行循环

    bash -c "$cmd" &
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用函数(通常用于存储代码):

    cmd() { while true ; do echo Evil Message; sleep 10; done; }
    cmd &
    
    Run Code Online (Sandbox Code Playgroud)