使用heredoc输入时,Bash返回代码错误处理

问题描述 投票:0回答:1

动机

我处于必须通过一次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样式编写脚本并保持正常的退出代码处理?

动机是我必须通过一次bash调用来运行多个bash命令,而无法编写完整的脚本文件(用例:将多个命令传递给...

linux bash shell heredoc
1个回答
0
投票
heredoc在子shell中执行。因此,您可以使用exit设置退出代码。使用typeset,可以将主shell中的功能放在子shell中。
© www.soinside.com 2019 - 2024. All rights reserved.