BASH 脚本中的 PIPESTATUS[0]
PIPESTATUS[0] in BASH script
我正在 Unix Bash 脚本中实现一个场景。我有两个脚本 ABC.bash 和 XYZ.bash。 ABC.bash 中存在一种情况,请求者未输入 Y 或 y 脚本退出并显示消息并且不再继续工作。 ABC.bash 当 运行 出现 alone.Problem 时工作正常,当我 运行 它来自另一个 bash 脚本时,即 XYZ.bash。它不检查退出条件。 XYZ.bash.
中的逻辑语法
echo "Calling ABC.bash from XYZ.bash"
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
then
echo "Do some work"
else
echo "Check ABC.bash input"
exit 1
fi
但是当 ABC.bash $a $b 状态为 2 的退出流仍然转到 IF 块而不是 ELSE.In 日志时,我可以看到消息为 DEBUGMODE 设置为 0。我需要这个 DEBUGMODE 设置,因为它是必需的,但如果 ABC.bash 退出,我想退出。理想情况下,它应该转到 ELSE 部分,因为 ABC.bash 用户输入错误退出。
此外,我在 XYZ.bash 脚本中设置了 DEBUGMODE 选项。喜欢-
if [[ -z "" ]]
then
echo " ">> No input so default to 0"
DEBUGMODE=0
else
echo "DEBUGMODE set to "
DEBUGMODE=
fi
enter code here
问题是 PIPESTATUS
是一个可变变量。也就是说,只要执行任何其他命令,它就会被重置。如果要检查 PIPESTATUS
.
,则需要删除对 sleep 2
的调用
作为最佳实践,除非您的代码可以完全控制任何变量内容,否则最好引用变量。这不会防止逻辑错误(例如,修改 PIPESTATUS 的额外睡眠),但它会避免意外地将代码注入脚本(或意外的语法错误)
if [ "${PIPESTATUS[0]}" = 0 ] ; then
在您的示例中,PIPESTATUS 反映了 sleep 2
的状态。所以替换
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
来自
ABC.bash $a $b | tee -a $LOGFILE; pstat=(${PIPESTATUS[@]}); sleep 2
if [ ${pstat[0]} = 0 ]
保存状态。
我正在 Unix Bash 脚本中实现一个场景。我有两个脚本 ABC.bash 和 XYZ.bash。 ABC.bash 中存在一种情况,请求者未输入 Y 或 y 脚本退出并显示消息并且不再继续工作。 ABC.bash 当 运行 出现 alone.Problem 时工作正常,当我 运行 它来自另一个 bash 脚本时,即 XYZ.bash。它不检查退出条件。 XYZ.bash.
中的逻辑语法echo "Calling ABC.bash from XYZ.bash"
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
then
echo "Do some work"
else
echo "Check ABC.bash input"
exit 1
fi
但是当 ABC.bash $a $b 状态为 2 的退出流仍然转到 IF 块而不是 ELSE.In 日志时,我可以看到消息为 DEBUGMODE 设置为 0。我需要这个 DEBUGMODE 设置,因为它是必需的,但如果 ABC.bash 退出,我想退出。理想情况下,它应该转到 ELSE 部分,因为 ABC.bash 用户输入错误退出。
此外,我在 XYZ.bash 脚本中设置了 DEBUGMODE 选项。喜欢-
if [[ -z "" ]]
then
echo " ">> No input so default to 0"
DEBUGMODE=0
else
echo "DEBUGMODE set to "
DEBUGMODE=
fi
enter code here
问题是 PIPESTATUS
是一个可变变量。也就是说,只要执行任何其他命令,它就会被重置。如果要检查 PIPESTATUS
.
sleep 2
的调用
作为最佳实践,除非您的代码可以完全控制任何变量内容,否则最好引用变量。这不会防止逻辑错误(例如,修改 PIPESTATUS 的额外睡眠),但它会避免意外地将代码注入脚本(或意外的语法错误)
if [ "${PIPESTATUS[0]}" = 0 ] ; then
在您的示例中,PIPESTATUS 反映了 sleep 2
的状态。所以替换
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
来自
ABC.bash $a $b | tee -a $LOGFILE; pstat=(${PIPESTATUS[@]}); sleep 2
if [ ${pstat[0]} = 0 ]
保存状态。