将 while 循环传递给超时

use*_*723 2 linux bash

我觉得这应该很简单,但引用之类的东西总是让我在 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}')
Run Code Online (Sandbox Code Playgroud)

所以我尝试这样做: 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}')这当然行不通。所以我尝试将它包装在 a 中bash -c,但我真的不知道如何正确地转义它......

任何帮助将不胜感激..我知道这可能是某些东西的重复,但我实际上环顾四周,我不能完全适应我在这里找到的例子。

ric*_*ici 5

的参数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
Run Code Online (Sandbox Code Playgroud)