为什么`bash -c'...'`会由于某些(但不是全部)错误而提前终止?

时间:2019-05-05 17:45:32

标签: bash kill

这是怎么回事?

以下按预期工作:

$ bash -c 'false; echo $?'
1

但是尝试使用pkill杀死一个不存在的进程会使bash在脚本完成之前终止。

$ bash -c 'pkill -f xyz_non_existent_process_xyz; echo $?'
[1]    21078 terminated  bash -c 'pkill -f xyz_non_existent_process_xyz; echo $?'

如果我在终端中运行此命令,则会发现pkill返回错误代码1,就像false命令那样:

$ pkill -f xyz_non_existing_process_xyz; echo $?
1

所以这两个命令都返回相同的状态代码...所以有什么区别!?

我尝试了多种方式包装命令。例如:

$ bash -c '(pkill -f xyz_non_existent_process_xyz || true); echo $?'
[1]    21309 terminated  bash -c '(pkill -f xyz_non_existent_process_xyz || true); echo $?'

所以看起来是什么原因导致bash提前终止,而不是任何命令的退出状态?

这是怎么回事?

1 个答案:

答案 0 :(得分:3)

很简单:pkill找到bash命令并停止执行。更改搜索模式,它将起作用:

  bash -c 'pkill -f "xyz_n""on_existent_process_xyz"; echo $?'

有点棘手:"xyz_n""on_existent_process_xyz"xyz_non_existent_process_xyz相同