Неверный код выхода внутри дочернего скрипта

У меня есть родительский скрипт, который выполняет дочерний скрипт в фоновом режиме:

#!/bin/bash
# parent.sh
childScript $param1 $param2&

Дочерний скрипт:

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

Если я выполню childScript.sh с правильными $ param1 и $param2, $? вернет 0. Если $ param1 и $ param2 неверны, $? вернет 1.

Но неважно, какие $ param1 и $ param2 я отправляю с использованием parent.sh, $? всегда возвращайте 0. Почему, если я отправляю неверные $ param1 и $ param2 из parent.sh, $? в childScript.sh вернуть 0?

1 ответ

В вашем дочернем скрипте вы "возвращаете" результат 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" для шаблона в "файле". Вот содержимое файла "файл".

$ cat file
c.sh
file
in.txt
p.sh
bill

Если grep найдет шаблон в файле, то grep удастся установить $? в 0. Но если grep не найдет шаблон в файле, grep потерпит неудачу с этим параметром $? до 1.

Здесь мы запускаем родителя с шаблоном "Боб"

$ ./parent.sh bob
1

grep не нашел боба в таких наборах $? до 1. echo выходы 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
Другие вопросы по тегам