我正在运行以下测试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。
答案 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。)