运行 bash 中的循环,单行超时
Run a loop in bash with timeout in a single line
我需要一个单行命令,在超时的情况下循环执行某些操作。
类似
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while true; do dd if=/tmp/nfsometer_trace/mnt/TESTFILE of=/dev/null bs=BLOCK_SIZE; done"
命令将在 'sh' 通过执行以下操作执行:
echo $COMMAND > COMMAND_FILE
sh COMMAND_FILE
但这给了我一个语法错误:
syntax error near unexpected token `do'
有什么方法可以让单行命令使无限循环超时?
像
这样的命令
while true ; do echo $(( i++ )) ; sleep 5 ; done
将产生类似
的输出
0
1
2
3
但是如果我尝试在超时时直接使用该命令,我会收到类似的错误消息,即
timeout 20 while true ; do echo $(( i++ )) ; sleep 5 ; done
bash: syntax error near unexpected token do
有些程序(例如 ssh)会处理很长的逻辑字符串,如果引用的话,那么参数都是一个字符串。
timeout 20 "while true ; do echo $(( i++ )) ; sleep 5 ; done"
timeout: failed to run command 'while true ; do ...'
同样的错误消息,我是否使用单引号来传递字符串。
阅读 info timeout
我们看到
COMMAND must not be a special built-in utility (*note Special built in utilities::).
也许 while
循环符合特殊的内置实用程序?
最后,请注意,我已经消除了对使用您拥有的 "wrapper" 信息的担忧,即。
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while ....
作为你的问题的原因。
当你遇到这样的问题时,最好向自己证明你的命令在更简单的情况下工作,然后然后让它在更复杂的用法中工作。
鉴于此证据,我不认为超时旨在执行您想要的操作。
作为最后的手段,我建议您尝试将 while
循环转换为脚本并仅调用
timeout 20 myLooperScript
IHTH
我需要一个单行命令,在超时的情况下循环执行某些操作。
类似
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while true; do dd if=/tmp/nfsometer_trace/mnt/TESTFILE of=/dev/null bs=BLOCK_SIZE; done"
命令将在 'sh' 通过执行以下操作执行:
echo $COMMAND > COMMAND_FILE
sh COMMAND_FILE
但这给了我一个语法错误:
syntax error near unexpected token `do'
有什么方法可以让单行命令使无限循环超时?
像
这样的命令 while true ; do echo $(( i++ )) ; sleep 5 ; done
将产生类似
的输出 0
1
2
3
但是如果我尝试在超时时直接使用该命令,我会收到类似的错误消息,即
timeout 20 while true ; do echo $(( i++ )) ; sleep 5 ; done
bash: syntax error near unexpected token do
有些程序(例如 ssh)会处理很长的逻辑字符串,如果引用的话,那么参数都是一个字符串。
timeout 20 "while true ; do echo $(( i++ )) ; sleep 5 ; done"
timeout: failed to run command 'while true ; do ...'
同样的错误消息,我是否使用单引号来传递字符串。
阅读 info timeout
我们看到
COMMAND must not be a special built-in utility (*note Special built in utilities::).
也许 while
循环符合特殊的内置实用程序?
最后,请注意,我已经消除了对使用您拥有的 "wrapper" 信息的担忧,即。
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while ....
作为你的问题的原因。
当你遇到这样的问题时,最好向自己证明你的命令在更简单的情况下工作,然后然后让它在更复杂的用法中工作。
鉴于此证据,我不认为超时旨在执行您想要的操作。
作为最后的手段,我建议您尝试将 while
循环转换为脚本并仅调用
timeout 20 myLooperScript
IHTH