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

  • Как создать tar-файл gnu, который может быть извлечен с помощью соляристой смолы
  • Выполнение пользовательской функции в вызове find -exec
  • linux & solaris - отдельная сетевая маска IP от обычных IP-адресов
  • Solaris 10 IPMP и зоны
  • ssh туннелирование локального экрана на другой сервер
  • Инструмент в UNIX для вычитания дат
  • Solaris 11: как получить свойства pkg в машиночитаемом формате
  • Когда UNIX «дефрагментирует»? (в частности, Solaris)
  • 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
    Linux и Unix - лучшая ОС в мире.