为什么bash -c表现得很奇怪

时间:2018-03-13 19:00:09

标签: bash curl syntax syntax-error

我有一个名为wait_script.sh的文件,其中包含以下内容

#!/bin/bash
until $(curl --output /dev/null --silent --head --fail http://localhost:4001);do
  printf '.'
  sleep 5
done

我可以用:

运行它
./wait_script.sh

并且按预期工作

我可以用以下方式运行相同的东西:

until $(curl --output /dev/null --silent --head --fail http://localhost:4001);do;printf '.';sleep 5;done

但是当我尝试在bash -c内运行时,我收到以下错误:

bash -c "until $(curl --output /dev/null --silent --head --fail http://localhost:4001);do;printf '.';sleep 5;done"

bash: -c: line 0: syntax error near unexpected token `;'
bash: -c: line 0: `until ;do;printf '.';sleep 5;done'

为什么会发生此错误?如何在bash -c内运行命令?

1 个答案:

答案 0 :(得分:1)

您有两个错误:

  1. do是任意命令列表的终结符,可以包含; - 分隔的命令列表。它本身不是由;终止的命令。省略doprintf之间的分号。
  2. 你根本不需要命令替换; until使用curl的退出状态来确定何时结束循环。您的原始代码仅起作用,因为curl不会为shell生成任何输出以作为命令处理,因此until“运行”空命令,该命令始终成功,立即终止循环。
  3. 你应该写

    bash -c 'until curl ...; do printf "."; sleep 5; done'
    

    确保在-c的参数中没有使用单引号。