Использовать использование команды ожидания в 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 

  • Как убить неактивных пользователей на Solaris?
  • В чем опасность установки максимального предела максимальным дескрипторам файлов для каждого процесса?
  • Конфигурация Sendmail с сопоставлением пользователей в Solaris
  • Как узнать прошивку NIC в Solaris 11.3?
  • Как я могу исключить все «отклоненные разрешения» сообщения из «find» в Solaris
  • как сделать контрольную сумму в папке в Solaris
  • squid: Незаконная инструкция (ядро сбрасывается)
  • Разрешение имен не работает, но nslookup делает
  • 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 

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

    Interesting Posts

    расхождение в выводах «swapon -show» и «df -h» для раздела swapon

    Инструмент для автоматического извлечения суб-изображений, находящихся внутри изображения: суб-изображения, разделенные пробелами

    Какой инструмент я могу использовать для создания резервных копий?

    Отключить vi от перехода к последней посещаемой строке при открытии файла.

    Как узнать, кто подключен к моей сети и сколько полос пропускания они используют?

    Вызов PolicyKit / polkit через xinit / startx?

    Не удалось запустить chmod, chown и даже ls в папке

    Наследование прав на запись группы, но не выполнение для файлов, на OmniOS (Illumos) с использованием ZFS ACL

    Решение Kickstarter для OpenBSD?

    Обработка каждой строки из текстового файла и удаление связанных файлов с диска

    Домашние каталоги Autofs с входами без пароля

    Sed линия перемещения от n ° 40 до 39 позиция

    Ошибка рецепта компиляции ядра для целевого «deb-pkg» не удалась

    Команда для отображения первых нескольких и последних нескольких строк файла

    Команда Echo с оператором AND не выходит

    Linux и Unix - лучшая ОС в мире.