Я пытаюсь написать сценарий bash
для открытия определенных файлов (в основном файлов PDF) с помощью команды gnome-open
. Я также хочу, чтобы терминал завершал работу после открытия файла PDF.
Я попытался добавить exit
в конец моего скрипта, однако это не закрывает терминал. Я пытался найти в Интернете ответ на свой вопрос, но не смог найти подходящий, я был бы очень признателен, если бы вы, ребята, могли помочь.
Мне нужен ответ, который убивает только терминал, с которого я запускаю команду, не все ли терминалы были бы возможны? Предыдущий ответ, который я принял, убивает все открытые окна терминала. Я не осознавал, что это имело место до сегодняшнего дня.
При открытии всего одного файла Вы не должны действительно использовать сценарий, потому что сценарий предназначен, чтобы быть простым способом выполнить несколько команд подряд, в то время как здесь просто необходимо выполнить две команды (включая 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
экземпляры связаны с Терминалом, это уничтожаемое не заставит Терминал закрывать себя.
Простое решение было бы:
xdg-open file.pdf && exit
В отличие от другой подобной команды nohup
не нужно для создания команды, игнорирующей SIGHUP
, при этом причина xdg-open
, выйдет из порождения дочернего процесса, который является предпочтительным приложением для открытия файла PDF. Поскольку фактический процесс, запущенный с терминала, больше не должен там уничтожаться, nohup
не нужно.
&&
указывает, что следующая команда будет выполнена, если предыдущая команда будет успешна т.е. возвратится, то код выхода 0
($?=0
) и exit
просто закроет терминал.
Лично я выполнил бы команду, чтобы открыть PDF или другие файлы в подоболочке, поместить задержку, чтобы позволить файлам открыться и затем выйти. В основном вот то, что я протестировал (nohup gnome-open *.pdf &); sleep 2; exit
, Вариация на это была бы nohup gnome-open *.pdf && sleep 2 && exit
Вы могли получить свой сценарий вместо того, чтобы выполнить его, например,
$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
Этот сценарий завершает терминал и таким образом оболочку и его.
Это беспощадно уничтожает все процессы. Если у Вас есть несколько вкладок, открытых в терминале, то они также закрываются.
проблема, если несколько терминалов будут открыты, и это дочерние процессы 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)
Явно отвечать на вопрос заголовка,
"Терминал выхода после запущения скрипта удара" :
, не смотря на детали, что делает сценарий, скрипт может быть непосредственно запущен в терминале с опцией -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"
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
отказ, о котором сообщают.