我可以使用timeout';在bash中为一个代码块执行s命令?

我可以使用timeout';在bash中为一个代码块执行s命令?,bash,Bash,我想使用timeout命令,但它只支持对单个命令进行超时 我的目标是这样做—等待端口列表出现: timeout 60 for port in $ports do while ! nc -zv localhost $port; do sleep 1 done done if [[ $? -ne 0 ]]; then echo not all ports up on time fi 如果60秒过去了,我希望for循环停止,并检查它是否成功 我明白我可以通过以

我想使用
timeout
命令,但它只支持对单个命令进行超时

我的目标是这样做—等待端口列表出现:

timeout 60 for port in $ports
do
    while ! nc -zv localhost $port; do
        sleep 1
    done
done
if [[ $? -ne 0 ]]; then
    echo not all ports up on time
fi
如果60秒过去了,我希望for循环停止,并检查它是否成功

我明白我可以通过以下方式实现这一点:

timeout 60 bash -c "..."
但这将是非常不可读的。我原以为bash函数可以作为命令使用,但它不起作用


有什么想法吗?

经过一些测试后,我成功地找到了一种使用bash函数实现此功能的方法,尽管它看起来有点奇怪,但可读性更强。以下是一个例子:

function my_loop() {
    for port in $ports; do
        while ! nc -zv localhost $port; do
            sleep 1
        done
    done
}

export -f my_loop
timeout 60 bash -c "my_loop"
if [[ $? -ne 0 ]]; then
    echo not all ports up on time
fi

如果不是在函数中写入代码,而是在另一个bash脚本中写入代码并超时该脚本的执行,该怎么办?
bash
没有内置的
timeout
命令;您正在运行的是一个外部程序,它需要一个可执行命令作为参数,而不是shell的任意片段。您需要类似于
timeout 60 bash-c'…'
。我认为答案是“不,您不能”。如果计数器为60,为什么不使用计数器并将其递增,然后退出while循环?