Shell脚本退出代码 - 无法设置

时间:2011-05-29 16:56:19

标签: bash shell exit

我正在运行以下测试bash脚本:

test.sh

======

pass=$1
if [ $pass -eq 1 ]; then
   exit 0
else
   exit 1
fi

=============

所以,如果我运行'./test.sh 1',它应该给我成功代码,即0.如果我运行'./test.sh 2'它应该给我特定的错误代码,即1。

但是当我运行脚本时,我得到0作为两种情况的退出代码。

输出

========================

# ./test.sh 1 |echo $?
  0
# ./test.sh 2 |echo $?
  0
#

=========================

我在这里做错了什么?任何帮助将不胜感激!

Noman A。

1 个答案:

答案 0 :(得分:11)

你的脚本有效,你的测试虽然破了。不要在那里使用管道。

# ./test.sh 1 ; echo $?
0
# ./test.sh 2 ; echo $?
1

您提出的管道无法正常工作,因为管道中的所有流程都是“同时”启动的。 shell启动一个子shell来托管每个进程(至少Bash,实现可能会有所不同 - 不确定),适当地连接输入和输出流,然后让操作系统按照自己的意愿安排事情。

因此,最右边的进程(在您的情况下为echo $?)与测试脚本“同时”启动。因此,该子shell中的$?(在实际进程启动之前已经扩展)不可能代表测试脚本的返回代码 - t.sh甚至可能尚未启动! / p>

有关更多信息,请参阅有关Unix Pipelines的维基百科文章,或有关管道的shell文档。 (例如Bash Pipelines。)