您能否解释为什么我的 shell 中的Ctrl+会影响先前在后台运行的命令:Cbash
`./my_script.sh 1` &
该命令立即用代码完成执行130
:
[1]+ Exit 130 `./my_script.sh 1` &
Ctrl+的通常行为C是终止前台进程。这里发生了什么?
编辑 1:(我的想法)可能与反引号有关 - 这里子 shell 进程启动,并且当父进程接收到它时,它会以某种方式接收到Ctrl+C
编辑2:我发现Ctrl+C停止使用反引号从当前 shell 运行的所有后台进程。
答案1
当你写命令时
`./my_script.sh 1` &
你正在做命令替换(见下文)。
实际上,你正在执行子壳(用于反引号的``
)在后台(&
)运行您的脚本(./my_script.sh 1
)。
这现壳正在等待其子 shell 执行结束,以将其输出作为命令运行
。子壳正在等待脚本结束。
当你按 Ctrl+C你打断这个等待,将信号传递SIGINT
给孩子。
此时,当前 shell 尝试将目前获得的输出作为命令运行……并生成错误,130
这意味着“脚本由 Control-C 终止” [2]。
在 bash 中使用反引号``
以及$()
命令替换 [1]:
Bash 通过执行 COMMAND 并用命令的标准输出替换命令替换来执行扩展,同时删除所有尾随换行符。
例如
echo `date` Thu Feb 6 10:06:20 CET 2003
请注意,如果你在后台运行更多此类命令
`./myscript 1` &
`./myscript 2` &
`./myscript 3` &
总是当前 shell 正在等待所有子进程的输出。单个Ctrl+C将结束所有等待。
如果您等待脚本结束,当前 shell 将在脚本完成时尝试执行其输出。