Почему мой скрипт bash не завершит выполнение?

Я скомпилировал короткий однострочный bash, чтобы сфокусировать запущенное приложение или запустить его, если он не запущен:

#!/bin/bash #intellilaunch.sh wmctrl -a $1 || $1 & disown exit 1 

Команда отлично прекращается при прямом запуске из командной строки:

 :~$ wmctrl -a firefox || firefox & disown [1] 32505 

Быстрая проверка с помощью системного монитора показывает, что работает только firefox.

Однако, когда я запускаю firefox через скрипт ( ./intellilaunch.sh firefox ), он intellilaunch.sh firefox новый процесс под названием intellilaunch.sh firefox , который выходит только после закрытия firefox.

Что я делаю не так?

Изменить :

Я изменил свой сценарий в соответствии с предложением Мича:

 #!/bin/bash program=$(basename $1) if ! wmctrl -a "$program"; then "$1"& fi 

Не один лайнер, но он отлично работает!

One Solution collect form web for “Почему мой скрипт bash не завершит выполнение?”

Я не могу воспроизвести это поведение в своей системе. Из вашего описания звучит так, будто процесс неправильно настроен на фоновый.

Попробуйте запустить bash -x intellilaunch.sh xclock , это должно показать, что происходит.

Также || привязывается сильнее, чем & , поэтому вы отправляете весь канал в фоновом режиме. Может быть, явная, if бы это была хорошая идея.

Ваш

 wmctrl -a firefox || firefox & disown ; exit 1 

интерпретируется как

 ( wmctrl -a firefox || firefox ) & disown ; exit 1 

тогда как вы, вероятно,

 wmctrl -a firefox || ( firefox & disown ) ; exit 1 

Из-за этого, bash запустит две работы, одна с wmctl и firefox, а другая с отключением и выходом. Поскольку второстепенная работа требует короткого времени для запуска, она, вероятно, вскоре начнет выполнять команды, поэтому выход bash -x кажется неправильным.

  • странное поведение команды строк
  • Получить статус выхода процесса, который передается в другой
  • Разрешение отклонено в файле под / tmp
  • как перенаправить вывод терминала в несколько файлов журнала
  • Новый родительский процесс, когда родительский процесс умирает
  • настроить ddclient для возврата внутреннего ip вместо общедоступного ip
  • Как уменьшить вывод ps aux на несколько строк?
  • Как написать скрипт abort-on-error без добавления `|| выйдите из $? `в каждую строку?
  • Подробный вывод отсутствует при выполнении сценария как CGI
  • Почему `exit &` не работает?
  • Вывод журнала экрана GNU в режиме реального времени?
  • Linux и Unix - лучшая ОС в мире.