您能否解释一下为什么我的 shell 中的Ctrl+会影响之前在后台运行的命令:Cbash
`./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)
该命令立即完成执行,130
代码如下:
[1]+ Exit 130 `./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)
Ctrl+的通常行为C是杀死前台进程。这里发生了什么?
编辑1:(我的想法)也许与反引号有关 - 这里子子shell进程启动并且当父进程收到它时它以某种方式接收Ctrl+C
编辑2:我发现Ctrl+C使用反引号停止从当前 shell 运行的所有后台进程。
当你写下命令时
`./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)
您正在执行命令替换(见下文)。实际上,您正在后台 ( ) 中
执行一个子 shell(反引号的子 shell ) ,并在其中运行您的脚本 ( )。 ``
&
./my_script.sh 1
当前shell正在等待其子 shell 执行结束,以将其输出作为命令运行。
子shell正在等待脚本结束。
当您按下 Ctrl+时C,您会中断此等待,并将信号传递SIGINT
给孩子。
此时,当前 shell 尝试作为迄今为止获得的输出的命令运行...并且它会生成错误130
,表示“脚本被 Control-C 终止” [ 2 ]。
在 bash 中,使用反引号``
以及使用$()
,您可以进行命令替换 [ 1 ]:
Bash 通过执行 COMMAND 并将命令替换替换为命令的标准输出来执行扩展,并删除所有尾随换行符。
例如
Run Code Online (Sandbox Code Playgroud)echo `date` Thu Feb 6 10:06:20 CET 2003
请注意,如果您在后台运行更多此类命令
`./myscript 1` &
`./myscript 2` &
`./myscript 3` &
Run Code Online (Sandbox Code Playgroud)
当前 shell 始终在等待所有子级的输出。一个Ctrl+C将结束所有人的等待。
相反,如果您等待脚本结束,则当前 shell 将尝试执行其输出,因为它们将完成。
归档时间: |
|
查看次数: |
3993 次 |
最近记录: |