我觉得这应该很简单,但引用和类似的东西总是让我困惑。我正试图通过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来包装它,但是我真的不知道如何正确地逃离它…
任何帮助都将不胜感激。我知道这可能是一个重复的东西,但我实际上环顾四周,我不能完全符合我在这里找到的例子,我的案件。

最佳答案

timeout的参数是一个命令。它不是shell表达式。也就是说,它是一个实用程序的文件名,后跟该实用程序的参数。(您可以使用重定向,但重定向应用于timeout命令;它们不由timeout解释。由于timeout在同一执行环境中执行指定的命令,因此重定向将由该命令继承。)
正如您所说,您可以使用bash命令来运行任何bash表达式,但是引用是很尴尬的。可使用以下文档简化报价:

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

关于linux - 将while循环传递给超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32132624/

10-16 18:09