如何在Bash中超时一组命令

Kon*_*tin 7 linux bash command timeout

我正在摆弄Linux命令"timeout":它只是在给定秒后停止长时间运行的命令.但我想暂停一个命令,而不是一组命令.我可以以两种方式()和{;}对命令进行分组,但是以下都不起作用:

timeout 1 { sleep 2; echo something; }
timeout 1 ( sleep 2; echo something )
Run Code Online (Sandbox Code Playgroud)

我怎么能用分组来做到这一点?

Joh*_*024 12

timeout不是shell实用程序,它不执行shell样式处理.必须给它一个单独的命令来执行.但是,该命令可以包含任意数量的参数.幸运的是,您可以提供的命令之一是bash:

timeout 1 bash -c '{ sleep 2; echo something; }'
Run Code Online (Sandbox Code Playgroud)

当然,在这种形式下,大括号现在是多余的:

timeout 1 bash -c 'sleep 2; echo something'
Run Code Online (Sandbox Code Playgroud)

bashtimeout执行的命令. -c并且sleep 2; echo something是该命令的参数.


Noa*_*nos 9

您还可以使用Here Document EOF方法动态创建多行脚本。它的主要优点是您可以使用双引号而不转义它:

timeout 1s bash <<EOF
    sleep 2s
    echo "something without escaping double quotes"  
EOF
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. EOF 闭包不得位于空格/制表符之后,而应位于最后一行的开头。
  2. 确保您已将本地函数与所有函数一起导出export -f my_funcset -o allexport为所有函数导出(在声明它们之前)。这也与之前的答案相关,因为调用 bash/sh 在新会话中运行该进程,不知道本地环境函数。


Cyr*_*rus 5

timeout 1 sh -c "sleep 2; echo something"
Run Code Online (Sandbox Code Playgroud)