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

Nom*_*mir 2 bash shell exit

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

test.sh

========

pass=$1
if [ $pass -eq 1 ]; then
   exit 0
else
   exit 1
fi
Run Code Online (Sandbox Code Playgroud)

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

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

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

产量

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

# ./test.sh 1 |echo $?
  0
# ./test.sh 2 |echo $?
  0
#
Run Code Online (Sandbox Code Playgroud)

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

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

诺曼A.

Mat*_*Mat 11

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

# ./test.sh 1 ; echo $?
0
# ./test.sh 2 ; echo $?
1
Run Code Online (Sandbox Code Playgroud)

您使用管道提出的建议无法正常工作,因为管道中的所有流程都是"同时"启动的.shell启动一个子shell来托管每个进程(至少Bash会这样做,实现可能会有所不同 - 不确定),适当地连接输入和输出流,然后让操作系统按照它认为合适的方式安排事情.

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

有关更多信息,请参阅有关Unix管道的Wikipedia文章,或有关管道的shell文档.(例如Bash Pipelines.)