Выход из терминала после запуска скрипта bash

Я пытаюсь написать сценарий bash для открытия определенных файлов (в основном файлов PDF) с помощью команды gnome-open. Я также хочу, чтобы терминал завершал работу после открытия файла PDF.

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

Мне нужен ответ, который убивает только терминал, с которого я запускаю команду, не все ли терминалы были бы возможны? Предыдущий ответ, который я принял, убивает все открытые окна терминала. Я не осознавал, что это имело место до сегодняшнего дня.

18
задан 22 April 2015 в 09:55

7 ответов

При открытии всего одного файла Вы не должны действительно использовать сценарий, потому что сценарий предназначен, чтобы быть простым способом выполнить несколько команд подряд, в то время как здесь просто необходимо выполнить две команды (включая exit).

Если Вы хотите работать exit после команды или после цепочки команд, можно объединить его в цепочку к тому, что Вы уже имеете при помощи && оператор (который на успехе предыдущей команды / цепочка команд выполнит следующую команду), или при помощи ; оператор (который и на успехе и при отказе предыдущей команды / цепочка команд выполнит следующую команду).

В этом случае это было бы что-то как этот:

gnome-open <path_to_pdf_file> && exit

* <path_to_pfd_file> = путь файла PDF

exit помещенный в конце сценария не работает, потому что он просто выходит bash экземпляр, в котором запущен скрипт, который является другим bash экземпляр, чем внутренний Терминал bash экземпляр.

Если Вы хотите использовать сценарий так или иначе, самый простой путь, он должен просто назвать сценарий как так:

<path_to_script> && exit

Или если сценарий находится в текущем рабочем каталоге Терминала как так:

./<script> && exit

Если Вы действительно не хотите к / не может сделать этого, второй самый большой простой путь состоит в том, чтобы добавить эту строку в конце Вашего сценария:

kill -9 $PPID

Это отправит a SIGKILL предупредите к к родительскому процессу сценария ( bash экземпляр, связанный с Терминалом). Если только один bash экземпляр связан с Терминалом, это уничтожаемое заставит Терминал закрывать себя. Если несколько bash экземпляры связаны с Терминалом, это уничтожаемое не заставит Терминал закрывать себя.

12
ответ дан 22 April 2015 в 19:55

Простое решение было бы:

xdg-open file.pdf && exit

В отличие от другой подобной команды nohup не нужно для создания команды, игнорирующей SIGHUP, при этом причина xdg-open, выйдет из порождения дочернего процесса, который является предпочтительным приложением для открытия файла PDF. Поскольку фактический процесс, запущенный с терминала, больше не должен там уничтожаться, nohup не нужно.

&& указывает, что следующая команда будет выполнена, если предыдущая команда будет успешна т.е. возвратится, то код выхода 0 ($?=0) и exit просто закроет терминал.

0
ответ дан 22 April 2015 в 19:55

Лично я выполнил бы команду, чтобы открыть PDF или другие файлы в подоболочке, поместить задержку, чтобы позволить файлам открыться и затем выйти. В основном вот то, что я протестировал (nohup gnome-open *.pdf &); sleep 2; exit

, Вариация на это была бы nohup gnome-open *.pdf && sleep 2 && exit

1
ответ дан 22 April 2015 в 19:55

Вы могли получить свой сценарий вместо того, чтобы выполнить его, например,

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
2
ответ дан 22 April 2015 в 19:55

Этот сценарий завершает терминал и таким образом оболочку и его.

Это беспощадно уничтожает все процессы. Если у Вас есть несколько вкладок, открытых в терминале, то они также закрываются.

проблема, если несколько терминалов будут открыты, и это дочерние процессы gnome-terminal-server, то все терминалы будут уничтожены.

В этом случае, сценарий должен быть запущен в независимом терминале, например, xterm

<your_command> & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • PPID

    PPID является идентификатором родительского процесса, в этом случае оболочка (e.g. /bin/bash)

  • PPPID

    , PPPID является идентификатором родительского процесса PPID, в этом случае, окно терминала

  • <your_command> & disown

    В оболочке удара, отрицание встроенной команды используется, чтобы удалить задания из таблицы задания или отметить задания так, чтобы сигнал SIGHUP не был отправлен им, если родительская оболочка получает его (например, если пользователь выходит из системы).

  • awk '{print $4}' "/proc/$PPID/stat"

    Получает значение четвертого столбца файла /proc/$PPID/stat (например, для /proc/1/stat это возвращается 0)

5
ответ дан 22 April 2015 в 19:55

Явно отвечать на вопрос заголовка,

"Терминал выхода после запущения скрипта удара" :

Выполнение только Ваш сценарий в терминале

, не смотря на детали, что делает сценарий, скрипт может быть непосредственно запущен в терминале с опцией -e (--command), не запуская оболочку - это используется вместо оболочки затем:

gnome-terminal -e ./script.sh

Использование опция -x (--execute), когда Вы хотите обеспечить аргументы сценарию. С этим просто целый остаток от командной строки взят в качестве команды и аргументов.

gnome-terminal -x ./script.sh foo bar

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

Примеры

teminal просто выйдет после команды, работающей в нем, выходы - как это, закрываясь после sleep выполнили 4 секунды без оболочки:

gnome-terminal -x sleep 4

, Конечно, можно все еще использовать сценарии оболочки, потому что сценарий использует другой экземпляр оболочки так или иначе.

кроме того, можно выполнить оболочку с явным сценарием - это не будет интерактивным:

gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"
0
ответ дан 22 April 2015 в 19:55

Можно использовать exec ./your-script.

Эмулятор терминала как Терминал GNOME выходит, когда начальное выполнение процесса в нем - который обычно является оболочкой - выходы.

Если Вы уже находитесь в терминале и единственной вещи, Вы хотите сделать прежде, чем выйти из того терминала, должен запустить конкретный скрипт (или программа), то это означает больше реальную необходимость в оболочке, которую это выполняет в нем больше. Таким образом можно использовать оболочку exec встроенный, чтобы заставить оболочку заменить себя процессом, созданным Вашей командой.

  • В случае Вашего сценария это - другой процесс оболочки - так же, как, как второй процесс оболочки создается, когда Вы запускаете скрипт без exec.

Синтаксис exec command, например, exec ./your-script.

exec: Пример

Например, предположите, что мне назвали сценарий оболочки count, отмеченный исполняемый файл, и расположенный в текущем каталоге. Это содержит:

#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done

И в терминале я работаю:

exec ./count

Это печатает цифры 5, 4, 3, 2, и 1, один в секунду, и затем завершения окна терминала.

Если Вы выполняете это от чего-то другого, чем первый процесс, выполненный в Вашем терминале - например, если Вы работали bash сначала для запуска другого экземпляра оболочки - затем это возвращает Вас оболочке, которая создала тот процесс, вместо того, чтобы выйти из терминала. (Этот протест применяется одинаково к exit- основанные методы.)

Можно использовать ./your-script; exit.

Если Вы не хотите говорить Вашей оболочке заменять себя новым процессом (через exec), можно сказать этому слоняться поблизости, но сразу выйти из себя после того, как новый процесс заканчивается.

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

Синтаксис command; exit, например, ./your-script; exit.

command; exit по сравнению с. command && exit

Можно заметить, что это выглядит подобным ./your-script && exit метод предлагается в ответах Коса и heemayl. Различие то, что:

  • && выполняет вторую команду, только если первая команда сообщила, что успешно выполнилась путем возврата кода выхода нуля.
  • ; выполняет вторую команду независимо от того, сообщила ли первая команда об успехе.

Какой, который Вы хотите, зависит от определенной ситуации. Если команда перестала работать, Вы хотите, чтобы оболочка вызова (и терминал хостинга) не легла спать? Если так, используйте &&; в противном случае используйте ;.

Существует также command || exit, который выходит из оболочки вызова только если command отказ, о котором сообщают.

4
ответ дан 22 April 2015 в 19:55

Другие вопросы по тегам:

Похожие вопросы: