Использовать использование команды ожидания в Linux?

#!/bin/bash function back() { sleep $1 exit $2 } back $1 $2 & b=$! if `wait $!`;then echo success else echo failure fi 
 bash-3.00# ./back 300 0 failure bash-3.00# ./back 300 1 failure 

Я ожидал success качестве статуса выхода, когда отправляю 0, но я все еще получаю failure .

Кроме того, wait не ждать 300 секунд. Вместо этого я получаю сообщение немедленно. Я предполагаю $! является непосредственным ребенком $$ в моем скрипте. Не так ли?

Можно ли зафиксировать статус выхода wait, например exit_status=$(wait $!) ?

 if ! ((exit_status));then echo sucess else failure fi 

3 Solutions collect form web for “Использовать использование команды ожидания в Linux?”

Проблема в том, что вы ожидаете wait в подоболочке:

 if `wait $!`;then 

Поскольку wait является встроенным, а не командой, он работает на подоболочке , а не на текущей оболочке.

Результат, который вы увидите, но не так:

 wait: pid 12344 is not a child of this shell 

… с возвратом статуса 1.

Чтобы выполнить свой тест, вам нужно будет сделать это без использования подоболочки.

 #!/bin/bash function back() { sleep $1 exit $2 } back $1 $2 & b=$! wait $b && echo success || echo failure 

Это дает ожидаемый результат и ждет столько, сколько вы ожидаете:

 $ time ./test.sh 3 0 success ./test.sh 3 0 0.00s user 0.01s system 0% cpu 3.012 total $ time ./test.sh 3 1 failure ./test.sh 3 1 0.00s user 0.01s system 0% cpu 3.012 total 

Вы можете проверить статус выхода любой команды с помощью $? :

 $ /bin/true $ echo $? 0 $ /bin/false $ echo $? 1 

В вашем скрипте было еще несколько ошибок. Ваш #! линия была неправильной, и я исправил ее. Вы назначаете $! до $b , но не используйте $b .

Удалите обратные выступы.

Как и вы, вы выполняете wait в подоболочке, которая не имеет доступа к заданиям родительской оболочки, поэтому она немедленно завершится.


Если вы хотите получить статус выхода, получите значение $? сразу после ожидания.

 command_here & wait status=$? 

Удаление обратных шагов сделает работу программы, но не полностью из-за уже выявленных причин. Верно, что wait сбой происходит немедленно, потому что оно работает в подоболочке и не может обращаться к процессам родителя, но программа не будет работать так, как ожидалось, даже если вы использовали команду, которая действительно работала.

Оператор if запускает программу и проверяет, равен ли ее статус выхода нулю или не равен нулю. Когда вы используете обратные вызовы, оператор if принимает результат процесса, пытается запустить его как программу, а затем использовать код выхода для этого процесса. Таким образом, программа не терпит неудачу, потому что wait терпит неудачу, но скорее она терпит неудачу, потому что wait не производит никакого вывода.

Вы можете заставить скрипт работать, используя echo в обратных тактах:

 if `echo wait $!`; then echo success else echo failure fi 

Или просто удалите обратные выходы; проще для всех.

  • коэффициент дедупликации zfs «низкий»
  • Что такое модуль apix для ОС?
  • Список всех открытых файлов .log 'в * nix
  • Код возврата всегда равен 0 после запуска echo "\ $ macroName" | ftp -i mymachine
  • Где GCC-5 после установки на Solaris 11?
  • Восстановление потерянного файла в Solaris 5.10
  • Спецификация Solaris ps aux comand. Почему для grep необходимо использовать параметр ww?
  • Как создать новый файл, который предоставляет имя файла и его исходную информацию каталога
  • Awk и отбрасывание несовпадающих токенов в строке?
  • ACL не всегда наследуется
  • Solaris 11_3 Установка на LDom через «telnet localhost 5000»
  • Как запустить сценарий при обновлении папки в Solaris 5.10?
  • Linux и Unix - лучшая ОС в мире.