【发布时间】:2020-02-12 02:07:47
【问题描述】:
动机
我的情况是,我必须通过一次 bash 调用运行多个 bash 命令,而无法编写完整的脚本文件(用例:Passing multiple commands to a container in Kubernetes)。 common solution 是将命令与; 或&& 组合在一起,例如:
bash -c " \
echo \"Hello World\" ; \
ls -la ; \
run_some_command "
在实践中,编写这样的 bash 脚本很容易出错,因为我经常忘记分号会导致细微的错误。
受this question 的启发,我尝试使用heredoc 以更标准的风格编写脚本:
bash <<EOF
echo "Hello World"
ls -la
run_some_command
EOF
不幸的是,我注意到使用 heredoc 时退出代码错误处理存在差异。例如:
bash -c " \
run_non_existing_command ; \
echo $? "
输出(注意$? 正确捕获了退出代码):
bash: run_non_existing_command: command not found
127
而
bash <<EOF
run_non_existing_command
echo $?
EOF
输出(请注意,与标准脚本执行相比,$? 无法捕获退出代码):
bash: line 1: run_non_existing_command: command not found
0
为什么heredoc 版本的行为不同?是否可以以heredoc 样式编写脚本并保持正常的退出代码处理?
【问题讨论】:
-
for instance:- 您的实例不组合命令(至少不是以我定义“组合”的方式),它运行bash -c echo "Hello World"然后运行 ls -la和run_some_command,所有在父壳中。我认为您缺少 \ 斜杠 -
@KamilCuk 正确修复,谢谢!复制粘贴错误,部署到 Kubernetes 时 `` 是通过 YAML 多行字符串处理的......观察结果应该仍然有效。
-
不,这不是一回事。可能同样的事情是
bash -c "echo \"Hello World\" ; ls -la ; run_some_command ;"