【问题标题】:Why is bash -c behaving strangely为什么 bash -c 行为异常
【发布时间】:2018-03-13 19:00:08
【问题描述】:

我有一个名为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 中运行命令?

【问题讨论】:

  • do关键字后面不能有分号;它实际上一个分号。请参阅 shellcheck.net。
  • 您可能不想将 -c 命令放在双引号中,因为这将只运行一次 curl 而 不会 重复运行。修复语法错误后,尝试使用单引号。
  • 我仍然有同样的错误bash -c "until $(curl --output /dev/null --silent --head --fail http://localhost:4001);do printf '.';sleep 5;done"
  • 我已经成为X Y problem的受害者,这就是我真正想问的:stackoverflow.com/questions/49264444/…

标签: bash curl syntax syntax-error


【解决方案1】:

你有两个错误:

  1. do 本身就是一个任意命令列表的终结符,该列表可能包含一个以; 分隔的命令列表。它本身不是由; 终止的命令。省略doprintf 之间的分号。
  2. 您根本不想在这里进行命令替换; until 使用curl 的退出状态来确定何时结束循环。您的原始代码之所以有效,是因为 curl 不会为 shell 生成任何输出以将其视为命令,因此 until “运行”空命令,该命令始终成功,并立即终止循环。

你应该写

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

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

【讨论】:

  • 感谢您的快速回复,并对问题提出的问题深表歉意。这个答案可能有用,但实际上并没有回答我想问的问题(对此真的很抱歉)。我想改为回答the other question(您将其标记为重复)。由于它们显然是重复的,我想删除这个问题并保留另一个问题。
  • 上述工作(谢谢),但是否有可能写任何会做同样的事情,但在双引号bash -c "..."
  • 您可以使用双引号,但您需要确保任何可能在双引号内展开的内容都被正确转义。
  • 啊,明白了,谢谢你的提示。如果我只是逃避$,一切都会奏效
  • 我不确定我是否会指望它;当curl 没有输出时,不需要命令替换。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多