Я пытаюсь написать bash
скрипт для открытия определенных файлов (в основном PDF-файлов) с помощью gnome-open
команды. Я также хочу, чтобы терминал завершил работу после открытия файла PDF.
Я попытался добавить exit
в конец моего сценария, однако это не закрывает терминал. Я пытался найти в Интернете ответ на свой вопрос, но не смог найти подходящий, я был бы очень признателен, если бы вы, ребята, могли помочь.
Мне нужен ответ, который убивает только терминал, с которого я запускаю команду, не все терминалы это было бы возможно? Предыдущий ответ, который я принял, убивает все открытые окна терминала. Я не осознавал, что это имело место до сегодняшнего дня.
command-line
bash
scripts
Rumesh
источник
источник
gnome-open
сxdg-open
в моем сценарии , но нет никаких изменений. Терминал по-прежнему открытОтветы:
Если вы открываете только один файл, вам на самом деле не нужно использовать сценарий, потому что сценарий предназначен для простого выполнения нескольких команд подряд, в то время как здесь вам просто нужно выполнить две команды (в том числе
exit
) ,Если вы хотите выполнить
exit
после команды или после цепочки команд, вы можете связать ее с тем, что у вас уже есть, с помощью&&
оператора (который при успешном выполнении предыдущей команды / цепочки команд выполнит следующую команду) или с помощью;
оператор (который как при успешном, так и при неудачном завершении предыдущей команды / цепочки команд выполнит следующую команду).В этом случае это будет что-то вроде этого:
* <path_to_pfd_file> = путь к файлу PDF
exit
положить в конец сценария не работает, потому что он просто выходит изbash
экземпляра, в котором выполняется сценарий, который является другимbash
экземпляром, чем внутреннийbash
экземпляр терминала .Если вы хотите использовать скрипт в любом случае, самый простой способ - просто вызвать скрипт так:
Или, если скрипт находится в текущем рабочем каталоге Терминала, вот так:
Если вы действительно не хотите / не можете этого сделать, второй самый простой способ - добавить эту строку в конец вашего скрипта:
Это отправит
SIGKILL
сигнал родительскому процессу сценария (bash
экземпляр связан с Терминалом). Если только одинbash
экземпляр связан с Терминалом, то уничтожение приведет к тому, что Терминал закроется сам. Еслиbash
с Терминалом связано несколько экземпляров, то уничтожение не приведет к закрытию Терминала.источник
SIGTERM
здесь недостаточно.Этот скрипт завершает работу терминала и, следовательно, оболочки и самого себя.
Это беспощадно убивает все процессы. Если в терминале открыто несколько вкладок, они также закрыты.
Проблема в том, что если открыто несколько терминалов, а это дочерние процессы
gnome-terminal-server
, все терминалы будут уничтожены.В этом случае скрипт должен быть запущен в независимом терминале, например
xterm
PPID
PPID - это идентификатор родительского процесса, в данном случае shell (
e.g. /bin/bash
)PPPID
PPPID - это идентификатор родительского процесса PPID, в данном случае это окно терминала.
<your_command> & disown
В оболочке bash встроенная команда disown используется для удаления заданий из таблицы заданий или для пометки заданий, чтобы сигнал SIGHUP не отправлялся им, если родительская оболочка его получает (например, если пользователь выходит из системы).
awk '{print $4}' "/proc/$PPID/stat"
Получает значение четвертого столбца файла
/proc/$PPID/stat
(например, для/proc/1/stat
него возвращается 0)источник
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Вы можете использовать .
exec ./your-script
Эмулятор терминала, такой как GNOME Terminal, завершает работу, когда завершается начальный процесс, выполняющийся внутри него - обычно это оболочка.
Если вы уже находитесь в терминале, и единственное, что вы хотите сделать перед выходом из этого терминала, это запустить определенный скрипт (или программу), то это означает, что вам больше не нужна оболочка, которая в нем работает. Таким образом, вы можете использовать
exec
встроенную функцию оболочки, чтобы она заменила себя процессом, созданным вашей командой.exec
.Синтаксис , например, .
exec command
exec ./your-script
exec
: примерНапример, предположим, что у меня есть сценарий оболочки с именем
count
исполняемый файл, расположенный в текущем каталоге. Это содержит:И в терминале я запускаю:
Это печатает цифры
5
,4
,3
,2
, и1
, по одному на каждую секунду, а затем окно закрывается терминал.Если вы запустите это из чего-то другого, чем первый процесс, запущенный в вашем терминале - например, если вы запустили
bash
сначала, чтобы запустить другой экземпляр оболочки - тогда это вернет вас к оболочке, которая создала этот процесс, вместо того, чтобы выйти из терминала. (Это предостережение относится в равной степени кexit
методам на основе.)Вы можете использовать .
./your-script; exit
Если вы не хотите указывать своей оболочке заменять себя новым процессом (через
exec
), вы можете попросить ее остаться, но выйти сразу после завершения нового процесса.Для этого запустите вашу команду и
exit
команду, разделенные;
так, чтобы они могли быть приведены в одной строке.Синтаксис
command; exit
, например, ../your-script; exit
command; exit
противcommand && exit
Вы можете заметить , это выглядит так же, метод , предложенный в Kos игровых и heemayl - х ответы. Разница в том, что:
./your-script && exit
&&
запускает вторую команду только в том случае, если первая команда сообщила, что ей это удалось , вернув нулевой код завершения .;
запускает вторую команду независимо от того, сообщила ли первая команда об успешном выполнении.Какой вы хотите, зависит от конкретной ситуации. Если команда не выполняется, вы хотите, чтобы вызывающая оболочка (и хост-терминал) продолжали работать? Если так, используйте
&&
; если нет, используйте;
.Существует также
command || exit
, который выходит из вызывающей оболочки только в случаеcommand
сообщения о сбое .источник
Вы можете использовать свой скрипт вместо того, чтобы его запустить, например
источник
Лично я выполнил бы команду, чтобы открыть pdf или другие файлы в подоболочке, отложил задержку, чтобы открыть файлы, и затем завершил работу. В основном вот что я проверял
(nohup gnome-open *.pdf &); sleep 2; exit
Вариация на это будет
nohup gnome-open *.pdf && sleep 2 && exit
источник
nohup
игнорирует сигнал зависания,nohup xdg-open some_program
сработало у меня и неexit
было необходимости.nohup
перенаправляет сообщение вnohup.out
файл:nohup: ignoring input and appending output to nohup.out
Самое простое решение было бы:
В отличие от других аналогичных команд
nohup
, они не нужны для игнорирования командыSIGHUP
, причина в том, что онаxdg-open
завершится, порождая дочерний процесс, который является предпочтительным приложением для открытия файла PDF. Поскольку фактический процесс, запущенный из терминала, больше не подлежит уничтожению,nohup
он не нужен.&&
указывает, что следующая команда будет выполнена, если предыдущая команда будет успешной, т.е. вернет код выхода0
($?=0
) иexit
просто закроет терминал.источник
exit
в конце и не работал ..exit
внутрь скрипта, что бесполезно, потому что имеет эффект выхода изbash
экземпляра, в котором выполняется скрипт, а не из родительскогоbash
экземпляра (тот, который связан с терминалом), что приведет к закрытию терминала вместоxdg-open
работает уже в фоновом режиме и не связан с терминалом, так чтоnohup
здесь вам это не нужно , плюс, насколько я понимаю, OP запускаетсяxdg-open
несколько раз внутри скрипта для пакетного открытия нескольких файлов, использованиеxdg-open
этого внутри скрипта вызовет скрипт чтобы выйти на первоеxdg-open
встречаемостиxdg-open
в backgr, даже если я имелnohup
это по другой причине и должна быть there..any фонового процесса от инициирующего терминала будет убит , когда вы убьете родительский терминал ..nohup
есть , чтобы предотвратить это ... поскольку мне не нужно снова использовать терминал в интерактивном режиме, нет необходимости помещать процесс в bg..на ваш второй пункт, который также можно предотвратить, запустив каждыйxdg-open && exit
в подоболочке ..Чтобы явно ответить на заглавный вопрос,
«Выход из терминала после запуска bash-скрипта» :
Запускай только свой скрипт в терминале
Не смотря на детали того, что делает скрипт, скрипт может быть напрямую запущен внутри терминала с помощью опции
-e
(--command
), без запуска оболочки - он используется вместо оболочки тогда:Используйте опцию
-x
(--execute
), если вы хотите предоставить аргументы скрипту. При этом только вся остальная часть командной строки принимается в качестве команды и аргументов.Если ваш скрипт завершается, нет никакой интерактивной оболочки, которая могла бы задержать что-либо, ожидая пользовательского ввода.
Примеры
Теминал просто выйдет после того, как выйдет запущенная в нем команда - вот так, закрытие после
sleep
4 секунд запуска без оболочки:Конечно, вы можете по-прежнему использовать сценарии оболочки, потому что в любом случае ваш сценарий использует другой экземпляр оболочки.
Кроме того, вы можете запустить оболочку с явным сценарием - она не будет интерактивной:
источник