Неверный код выхода внутри дочернего скрипта
У меня есть родительский скрипт, который выполняет дочерний скрипт в фоновом режиме:
#!/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