Код выхода сценария оболочки - невозможно установить - PullRequest
2 голосов
/ 29 мая 2011

Я использую следующий тестовый сценарий 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
#

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

Что я здесь не так делаю? Любая помощь будет принята с благодарностью!

Номан А.

1 Ответ

11 голосов
/ 29 мая 2011

Ваш скрипт работает, ваш тест не работает.Не используйте трубы там.

# ./test.sh 1 ; echo $?
0
# ./test.sh 2 ; echo $?
1

То, что вы предложили с конвейером, не может работать, потому что все процессы в конвейере запускаются "одновременно".Оболочка запускает под-оболочку для размещения каждого процесса (по крайней мере, это делает Bash, реализации могут отличаться - в этом нет уверенности), соответствующим образом соединяет входной и выходной потоки, а затем позволяет ОС планировать события по своему усмотрению.

Таким образом, самый правый процесс (в вашем случае echo $?) запускается в то же время, что и ваш тестовый скрипт.Следовательно, $? в этой вложенной оболочке (которая будет развернута до запуска фактического процесса) не может представлять код возврата из тестового сценария - t.sh, возможно, даже еще не запустился!

См. Статью в Википедии Трубопроводы Unix для получения дополнительной информации или документации по оболочкам.( Bash Pipelines , например.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...