我觉得这应该很简单,但是引用等等总是让我在bash中迷惑。我正在尝试通过ssh连接运行命令,我想在命令中使用timeout
。一切都很好,简单的命令,但现在我想运行这样的东西(只是一个模拟):
while read id; do
find . -name $id -exec echo '{}' \;
find . -name ${id}-other -exec echo '{}' \;
done < <(grep foo foo.txt | awk '{print $1}')
所以我试试这个:
timeout 60 while read id; do find . -name $id -exec echo '{}' \;; find . -name ${id}-other -exec echo '{}' \;; done < <(grep foo foo.txt | awk '{print $1}')
这当然不起作用。所以我尝试将其包裹在bash -c
中,但我真的无法弄清楚如何正确地逃避它......
任何帮助都会受到赞赏..我知道这可能与某些东西重复,但实际上我已经环顾四周了,我可以完全适合我在这里找到的案例。
答案 0 :(得分:3)
timeout
的参数是命令。 不是一个shell表达式。也就是说,它是实用程序的文件名,后跟该实用程序的参数。 (您可以使用重定向,但重定向应用于timeout
命令;它们不由timeout
解释。由于timeout
在同一执行环境中执行指定的命令,重定向将由命令继承。)
正如您所说,您可以使用bash
命令运行任何bash表达式,但引用很尴尬。使用here-docs可以简化引用:
timeout 60 bash <<"EOF"
while read id; do
find . -name $id -exec echo '{}' \;
find . -name ${id}-other -exec echo '{}' \;
done < <(grep foo foo.txt | awk '{print $1}')
EOF