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 ]

保存状态。