Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 重复运行shell命令直到失败?_Bash - Fatal编程技术网

Bash 重复运行shell命令直到失败?

Bash 重复运行shell命令直到失败?,bash,Bash,我写了一个不可靠的测试。我已经添加了一些调试代码,但现在我想运行测试,直到它失败,这样我就可以收集调试输出 我已设置测试,因此可以使用以下方法运行它: ./runtest 我当前的解决方案是编写untilfail脚本: #!/bin/bash $@ while [ $? -eq 0 ]; do $@ done 然后使用它: untilfail ./runtest 有更简单的解决方案吗?同时执行命令,因此您可以使用更简单的解决方案 while ./runtest; do :; don

我写了一个不可靠的测试。我已经添加了一些调试代码,但现在我想运行测试,直到它失败,这样我就可以收集调试输出

我已设置测试,因此可以使用以下方法运行它:

./runtest
我当前的解决方案是编写
untilfail
脚本:

#!/bin/bash
$@
while [ $? -eq 0 ]; do
    $@
done
然后使用它:

untilfail ./runtest

有更简单的解决方案吗?

同时执行命令,因此您可以使用更简单的解决方案

while ./runtest; do :; done
/runtest
返回非零退出代码(通常表示失败)时,这将停止循环

不过,要进一步简化当前的解决方案,只需将untilfail脚本更改为如下所示:

#!/bin/bash

while "$@"; do :; done
然后,您可以使用已经使用的任何命令调用它:

untilfail ./runTest --and val1,val2 -o option1 "argument two"

如果您不想将复杂的管线包装到shell脚本或函数中,则此操作有效:

while true; do 
  curl -s "https:..." | grep "HasErrors.:true"
  if [[ "$?" -ne 0 ]]; then 
    break
  fi
  sleep 120
done

在这种情况下,HTTP请求总是返回200,但也返回一些JSON,该JSON具有属性“HasErrors”:出现错误时为true。

在一个到处重复shell重试逻辑的系统中遇到类似问题后,我制作了一个名为“重试”的专用工具来解决此问题:

一个更复杂的例子:

retry --until=fail --message="test succeeded" --delay=1 ./runtest

可以从中获得的工具。

还可以指出,
[
是一个命令。对于新用户来说,
[
if
while
语法的一部分。我如何计算它在失败之前运行了多少次?@GrantJ:其实很简单。将
count=0
放在循环之前,而不是
放在循环中(无操作),放
((count++)
-这会增加计数器。生产率问题:如果您使用的系统带有
say
和扬声器,您可以在./runtest;do:;done&&say test failed
时使用
stops@Schneems:值得注意的是,
say
是macOS特有的。旁注:习惯性地引用“$@”。
retry --until=fail --message="test succeeded" --delay=1 ./runtest