Почему мой скрипт 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 кажется неправильным.

  • Дружественный ресурс для указания программы пользователя не висит
  • Использование Diff с -y для получения бок о бок
  • Новый родительский процесс, когда родительский процесс умирает
  • Как мне выполнить мой сценарий еще одну команду после того, как предыдущая команда вернет ненулевое значение до того, как оно будет прервано?
  • Подробный вывод отсутствует при выполнении сценария как CGI
  • test, если return true, если grep на выходе имеет строку в одной строке
  • Как заставить ssh-соединение выйти в конце скрипта
  • Почему команда 'at' не печатает на стандартный вывод?
  • Оставьте удаленную команду запущенной для хранения вывода
  • Как уменьшить вывод ps aux на несколько строк?
  • Где определяется `exit`?
  • Interesting Posts

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

    команда, как wc, но с тиковым поведением

    Как заставить `command-not-found` работать в Debian Stretch

    Прерывистые сетевые подключения – CentOS

    Chroot для повторной установки Grub2, mnt / пуст

    Просмотр режима файла без перечисления всех файлов

    Как оптимизировать этот oneliner? (если второй столбец пуст, поместите строку в другой файл)

    Печать файла с количеством жестких ссылок

    Сценарий Bash, создающий нежелательные файлы

    Декодирование сообщений ASN.1 с помощью инструмента Openssl asn1parse

    Сообщение «Неверная соль» при входе в систему. Какой алгоритм используется для генерации пароля пользователя?

    скрипт bash пытается выполнить переменную

    Зачем нам нужен драйвер usbkbd, когда есть usbhid?

    Принимая значение регистра и используя его позже как переменную

    Manjaro: изменить текстовый редактор по умолчанию на Sublime Text 3

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