Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将超时命令与自己的函数一起使用?_Bash_Function_Shell_Timeout - Fatal编程技术网

Bash 如何将超时命令与自己的函数一起使用?

Bash 如何将超时命令与自己的函数一起使用?,bash,function,shell,timeout,Bash,Function,Shell,Timeout,我希望将超时命令与自己的功能一起使用,例如: #!/bin/bash function test { sleep 10; echo "done" } timeout 5 test 但是当调用这个脚本时,它似乎什么都没做。外壳在我启动后立即返回 有没有办法解决这个问题,或者超时不能在自己的函数上使用?timeout似乎不是bash的内置命令,这意味着它无法访问函数。您必须将函数体移动到新的脚本文件中,并将其作为参数传递给timeout。timeout似乎不是bash的内置命令,这意味着它无法访

我希望将超时命令与自己的功能一起使用,例如:

#!/bin/bash
function test { sleep 10; echo "done" }

timeout 5 test
但是当调用这个脚本时,它似乎什么都没做。外壳在我启动后立即返回


有没有办法解决这个问题,或者超时不能在自己的函数上使用?

timeout
似乎不是
bash
的内置命令,这意味着它无法访问函数。您必须将函数体移动到新的脚本文件中,并将其作为参数传递给
timeout

timeout
似乎不是
bash
的内置命令,这意味着它无法访问函数。您必须将函数体移动到一个新的脚本文件中,并将其作为参数传递给
timeout

timeout
需要一个命令,不能使用shell函数

不幸的是,上面的函数与
/usr/bin/test
可执行文件有名称冲突,这会导致一些混乱,因为
/usr/bin/test
会立即退出。如果将函数重命名为(比如)
t
,您将看到:

brian@machine:~/$ timeout t
Try `timeout --help' for more information.

这没有多大帮助,但可以用来说明发生了什么。

timeout
需要一个命令,不能用于shell函数

不幸的是,上面的函数与
/usr/bin/test
可执行文件有名称冲突,这会导致一些混乱,因为
/usr/bin/test
会立即退出。如果将函数重命名为(比如)
t
,您将看到:

brian@machine:~/$ timeout t
Try `timeout --help' for more information.

这没有多大帮助,但可以用来说明发生了什么。

如果您在一个单独的脚本中隔离您的函数,您可以这样做:

(sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
myfunction.sh

如果在单独的脚本中隔离函数,可以通过以下方式执行:

(sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
myfunction.sh
一种方法是

timeout 5 bash -c 'sleep 10; echo "done"'
相反。虽然你也可以这样:

f() { sleep 10; echo done; }
f & pid=$!
{ sleep 5; kill $pid; } &
wait $pid
一种方法是

timeout 5 bash -c 'sleep 10; echo "done"'
相反。虽然你也可以这样:

f() { sleep 10; echo done; }
f & pid=$!
{ sleep 5; kill $pid; } &
wait $pid

当我自己尝试实现这一目标时发现了这个问题,并根据@geirha的答案,我得到了以下结果:

#/usr/bin/env bash
#“thisfile”包含此脚本的完整路径
thisfile=$(readlink-ne“${BASH_SOURCE[0]}”)
#该函数用于超时
func1()
{ 
回显“这是func1”;
睡60
}
###主要###
#仅当此文件不是源文件时才执行“main”
如果[[“${BASH_SOURCE[0]}”==“${0}”];然后
#2秒后超时func1,即使它将休眠60秒
超时2 bash-c“源$thisfile&&func1”
fi

由于
timeout
在一个新的shell中执行其给定的命令,所以技巧在于让子shell环境来源代码脚本,以继承您想要运行的函数。第二个诀窍是使其具有一定的可读性…,这导致了
thisfile
变量。

在自己尝试实现这一点时发现了这个问题,从@geirha的答案开始,我得到了以下结果:

#/usr/bin/env bash
#“thisfile”包含此脚本的完整路径
thisfile=$(readlink-ne“${BASH_SOURCE[0]}”)
#该函数用于超时
func1()
{ 
回显“这是func1”;
睡60
}
###主要###
#仅当此文件不是源文件时才执行“main”
如果[[“${BASH_SOURCE[0]}”==“${0}”];然后
#2秒后超时func1,即使它将休眠60秒
超时2 bash-c“源$thisfile&&func1”
fi

由于
timeout
在一个新的shell中执行其给定的命令,所以技巧在于让子shell环境来源代码脚本,以继承您想要运行的函数。第二个技巧是使其具有一定的可读性…,这导致了
thisfile
变量。

什么是
timeout
命令?它不是bash的内置版本。从另一个SOF链接可以得到更多的答案:
timeout
命令是什么?这不是bash的内置版本。其他SOF链接提供了更多答案: