Linux 子脚本中的退出代码不正确

Linux 子脚本中的退出代码不正确,linux,bash,exitstatus,Linux,Bash,Exitstatus,我有一个父脚本,在后台执行子脚本: #!/bin/bash # parent.sh childScript $param1 $param2& 子脚本: #!/bin/bash # childScript.sh param1=$1 param2=$2 someLinuxCommand $param1 $param2 out=$? echo $out 如果我使用正确的$param1和$param2执行childScript.sh,$?将返回0。如果$param1和$param2不正确,$

我有一个父脚本,在后台执行子脚本:

#!/bin/bash
# parent.sh
childScript $param1 $param2&
子脚本:

#!/bin/bash
# childScript.sh
param1=$1
param2=$2
someLinuxCommand $param1 $param2
out=$?
echo $out

如果我使用正确的$param1和$param2执行childScript.sh,$?将返回0。如果$param1和$param2不正确,$?将返回1


但无论我使用parent.sh发送什么$param1和$param2,$?始终返回0。为什么从parent.sh,$发送错误的$param1和$param2?在childScript.sh中返回0?

在子脚本中,您正在“返回”echo的结果,该结果将始终为0。你应该使用

exit $? 
。。。相反或者干脆把那条线都放在外面

下面是一个模仿脚本的示例:

$ cat parent.sh
#!/bin/bash

p1=$1
p2='file'
./child.sh $p1 $p2

$ cat child.sh
#!/bin/sh

grep $1 $2
out=$?
echo $out
子脚本将为“文件”中的模式“grep”。以下是文件“file”的内容

如果grep在文件中找到模式,grep将成功设置$?到0。但是如果grep在文件中找不到模式,grep将无法通过此设置$?对1

在这里,我们使用“bob”模式运行parent

grep
未在中找到bob,因此将
$?
设置为1<代码>回显输出1,然后将
$?
设置为0

$ echo $?
0
让我们将child.sh脚本修复为:

$ cat child.sh
#!/bin/sh

grep $1 $2
然后再次运行parent.sh:

$ ./parent.sh bob
$ echo $?
1

$ ./parent.sh bill
bill
$ echo $?
0

同样的答案。您的子脚本退出代码是成功执行
echo
的退出代码。不要执行
回显$out
。退出代码将是echo的退出代码,这不是您想要的。>>>如果我使用正确的$param1和$param2执行childScript.sh,$?将返回0。如果$param1和$param2不正确,$?将返回1。当我从父脚本执行childScript.sh时出现问题。您的脚本“返回”一个退出代码,该代码设置为脚本中执行的最后一条语句的errno。childScript.sh中执行的最后一条语句(someLinuxCommand$param1$param2)不正确,但$out==0.No。在子脚本中执行的最后一条语句是
echo
,它成功地将
$?
设置为零。确保
someLinuxCommand
的returncode正确,然后删除
out=$?
echo$out
。如果我使用正确的$param1和$param2执行childScript.sh,$?将返回0。如果$param1和$param2不正确,$?将返回1。甚至不应该运行,作业之间不应该有空格。@123修复问题。我在代码中没有空格。我忘记了有一刻,childScript在后台执行(childScript$param1$param2&)
$ cat child.sh
#!/bin/sh

grep $1 $2
$ ./parent.sh bob
$ echo $?
1

$ ./parent.sh bill
bill
$ echo $?
0