我需要一个单行命令,它可以在一个超时的循环中执行某些操作。
像
这样的东西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
但是这给了我一个语法错误:
意外标记“do”
附近的语法错误
有没有办法让单行命令超时无限循环?
答案 0 :(得分:2)
像
这样的命令 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 ...'
相同的错误消息我是否使用单个dbl-quotes传入字符串。
阅读info timeout
我们看到了
COMMAND must not be a special built-in utility (*note Special built in utilities::).
也许while
循环有资格成为特殊的内置实用程序?
最后,请注意我已经删除了担心使用您拥有的“包装”信息,即。
export TIMEOUT=60
export BLOCK_SIZE=65536
COMMAND="timeout TIMEOUT while ....
导致您的问题。
当你遇到这样的问题时,最好向自己证明你的命令工作在一个更简单的情况下,然后让它在一个更复杂的用法中工作。
鉴于这些证据,我认为超时不是为了做你想做的事。
作为最后的手段,我建议您尝试将while
循环转换为脚本并仅调用
timeout 20 myLooperScript
IHTH