Linux 将命令结果指定给变量时,Shell挂起

Linux 将命令结果指定给变量时,Shell挂起,linux,shell,command-substitution,Linux,Shell,Command Substitution,我最初的问题是在超时时杀死进程及其子进程。我发现GNUtimeout是一个不错的选择 然而,在这个测试用例中,事情变得很奇怪: 假设我们有这样一个test1.sh: #/垃圾箱/垃圾箱 #test1.sh 输出=`timeout 2./run.sh` echo$输出 然后像这样运行.sh: 直观地说,我们应该期望test1.sh立即退出,因为init将负责这个愚蠢的sleep进程,然后run.sh将退出 然而: sh-4.2$time./test1.sh 实数0m8.022s 用户0m0.0

我最初的问题是在超时时杀死进程及其子进程。我发现GNU
timeout
是一个不错的选择

然而,在这个测试用例中,事情变得很奇怪:

假设我们有这样一个
test1.sh

#/垃圾箱/垃圾箱
#test1.sh
输出=`timeout 2./run.sh`
echo$输出
然后像这样运行.sh:

直观地说,我们应该期望
test1.sh
立即退出,因为
init
将负责这个愚蠢的
sleep
进程,然后
run.sh
将退出

然而:

sh-4.2$time./test1.sh
实数0m8.022s
用户0m0.013s
sys 0m0.003s
如果我创建这个
test2.sh

#/垃圾箱/垃圾箱
#test2.sh
超时2./run.sh
sh-4.2$time./test2.sh
实际0m0.014s
用户0m0.003s
系统0m0.007s

显然,我们在命令替换过程中遇到了一些错误,但为什么呢?

这可能是您在shell脚本中的方式--

--您正在使用命令替换,因此只要命令尚未完成执行,就无法进行替换,因为输出不在那里……这可能解释了您看到的输出

试着这样做可以看到类似的结果

echo "hello `sleep 2 &`"
另一个有趣的剧本--

使用

echo "hello `sh y.sh`"

$time sh y.sh
hi
bye

real    0m0.006s
user    0m0.000s
sys     0m0.004s

$time echo "hello `sh y.sh`"
hello hi
bye

real    0m2.008s
user    0m0.004s
sys     0m0.000s

解释有关后台进程和文件描述符之间关系的更多信息。基本上:

后台(更好:分叉)进程继承文件描述符, 在backticks中运行命令意味着在 它的出口关闭了


是的,你的例子更能说明问题!但我认为,在我的示例中,
run.sh
应该退出,因为它的原始子级由
init
接管?是的,它将由
init
接管,但是它的执行仍然没有完成…所以输出还没有准备好被替换…请看我的第二个示例来验证这一点…
y.sh
应该很快就会退出,但是由于在后台运行,
echo
命令需要超过
2secs
来完成…有趣的东西:)好的,如果我将
run.sh
更改为:
sleep 8s&;日期;退出0
,是否认为其结果已完成?实际上,我不确定什么是“执行完成”:)谢谢!讨论很有帮助!
echo "hello `sleep 2 &`"
$ cat y.sh
echo "hi"
sleep 2 &
echo "bye"
sleep 2 &
echo "hello `sh y.sh`"

$time sh y.sh
hi
bye

real    0m0.006s
user    0m0.000s
sys     0m0.004s

$time echo "hello `sh y.sh`"
hello hi
bye

real    0m2.008s
user    0m0.004s
sys     0m0.000s