为何命令列表会延迟subshell的控制权释放?
Bash子shell中命令列表的延迟退出问题
执行以下Bash命令时,会瞬间退出,几乎看不到延迟:
( sleep 50 > /dev/null 2>&1 &) && exit 0
但如果在子shell的命令组内使用命令列表(用&&、||、;等分隔多个命令),比如执行:
( sleep 50 && sleep 50 > /dev/null 2>&1 &) && exit 0
则会暂停约2秒,并输出:
exit
无论把&&替换为||、;等任何列表分隔符,或是改用{ command1 ; command2 ; }分组,都会出现相同的延迟。
只有以下两种方式能恢复瞬间退出的速度:
- 嵌套调用bash执行命令字符串:
( bash -c 'sleep 50 && sleep 50' > /dev/null 2>&1 &) && exit 0 - 将命令写入脚本后执行:
先创建脚本wrapperScript.sh:
再执行:#!/usr/bin/env bash sleep 50 || sleep 50( ./wrapperScript.sh > /dev/null 2>&1 &) && exit 0
我原本认为子shell ( c1 || c2 && c3 ;; c4 ) 和将命令写入脚本执行的行为基本一致,但实际并非如此。已知Bash对非复合命令的命令组有fork优化,但不清楚这为何会导致退出延迟变长,希望弄清原因。
内容的提问来源于stack exchange,提问作者Ar3s
相关产品推荐
相关产品推荐

