Я пытаюсь написать скрипт bash для открытия определенных файлов (в основном файлов PDF) с помощью команды gnome-open. Я также хочу, чтобы терминал выходил, когда он открывает файл pdf.
Я попытался добавить exit в конец моего скрипта, однако это не закрывает терминал. Я попытался найти в Интернете ответ на мой вопрос, но я не мог найти подходящего, я был бы очень признателен, если бы вы, ребята, могли помочь.
Мне нужен ответ, который убивает только терминал который я запускаю командой не все терминалы, это было бы возможно? Предыдущий ответ, который я принял, убивает все открытые окна терминала. Я не понимал, что это было до сегодняшнего дня.
Этот скрипт завершает терминал и, следовательно, оболочку и себя.
Он беспощадно убивает все процессы. Если в терминале открыто несколько вкладок, они также закрыты.
Он безжалостно убивает все процессы. Если в терминале открыто несколько вкладок, то они также закрыты.
В этом случае сценарий должен запускаться в независимом терминале, например xterm
[ f1] PPID PPID - это идентификатор родительского процесса, в этом случае PPPID оболочки (e.g. /bin/bash) PPPID - это идентификатор родительского процесса PPID, в этом случае окно терминала <your_command> & disown. В оболочке bash, команда disown builtin используется для удаления заданий из таблицы заданий или для отметки заданий, чтобы сигнал SIGHUP не отправлялся им, если родительская оболочка получает ее (например, если пользователь выходит из системы). awk '{print $4}' "/proc/$PPID/stat" Получает значение четвертого столбца файла /proc/$PPID/stat (например, для /proc/1/stat он возвращает 0)Терминальный эмулятор, такой как GNOME Terminal, завершает работу, когда внутри него запускается начальный процесс, который обычно является оболочкой.
Если вы уже находитесь в терминале и единственное, что хотите сделать, прежде чем покинуть этот терминал, чтобы запустить конкретный скрипт (или программу), то это означает, что вам больше не нужна оболочка, работающая в ней. Таким образом, вы можете использовать встроенную оболочку exec оболочки, чтобы заставить оболочку заменить себя процессом, созданным вашей командой.
В случае вашего сценария это другой процесс оболочки - так же, как вторая оболочка процесс создается при запуске скрипта без exec.Синтаксис exec command, например, exec ./your-script.
Например, предположим, что у меня есть сценарий оболочки, называемый 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.)
Если вы не хотите, чтобы ваша оболочка заменила себя новый процесс (через exec), вы можете сказать, что он придерживается, но выходите сразу после завершения нового процесса.
Для этого запустите команду и команду exit, разделенные [ f20], поэтому они могут быть заданы на одной строке.
Синтаксис command; exit, например ./your-script; exit.
Вы можете заметить, что это похоже на метод ./your-script && exit, предложенный в ответах kos и heemayl. Разница в том, что:
В случае вашего скрипта это другой процесс оболочки - так же, как создается второй процесс оболочки при запуске скрипта без exec. [!d5 ] ; запускает вторую команду независимо от того, сообщала ли первая команда успех.Какой из них вы хотите, зависит от конкретной ситуации. Если команда не удалась, вы хотите, чтобы вызывающая оболочка (и хостинг-терминал) не вставала? Если это так, используйте &&; Если нет, используйте ;.
Существует также command || exit, который выходит из вызывающей оболочки только в том случае, если command сообщает об ошибке.
Самое простое решение было бы:
xdg-open file.pdf && exit
В отличие от другой подобной команды nohup не требуется, чтобы команда игнорировала SIGHUP, причина, по которой xdg-open, выйдет из нереста дочернего процесса который является предпочтительным приложением для открытия pdf-файла. Поскольку фактический процесс, запущенный с терминала, больше не должен быть убит, nohup не требуется.
&& указывает, что следующая команда будет запущена, если предыдущая команда будет успешной, т.е. вернет выход код 0 ($?=0) и exit просто закроют терминал.
Вы можете использовать свой скрипт вместо его запуска, например
$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
Лично я бы выполнил команду, чтобы открыть PDF или другие файлы в подоболочке, поставить задержку, чтобы файлы открылись, а затем выйти. В принципе, вот что я тестировал (nohup gnome-open *.pdf &); sleep 2; exit
Вариация на этом будет nohup gnome-open *.pdf && sleep 2 && exit
Чтобы ответить на вопрос заголовка,
«Закройте терминал после запуска сценария bash»:
Не глядя при подробностях, что делает скрипт, скрипт может быть непосредственно запущен внутри терминала с опцией -e (--command), не запуская оболочку - он используется вместо оболочки:
gnome-terminal -e ./script.sh
Используйте опцию -x (--execute), если вы хотите предоставить аргументы сценарию. При этом весь остаток командной строки принимается за команду и аргументы.
gnome-terminal -x ./script.sh foo bar
Если ваш сценарий завершен, нет интерактивной оболочки, которая могла бы задержать все, ожидая ввода пользователя.
Тестирование будет завершено только после того, как команда, запущенная в нем, выйдет - например, закрытие после sleep выполняется 4 секунды без оболочки:
gnome-terminal -x sleep 4
Конечно, вы можете использовать скрипты оболочки, потому что ваш скрипт все равно использует другой экземпляр оболочки.
Кроме того, вы можете запустить оболочку с явным скриптом - она не будет интерактивной: [ ! d10]
gnome-terminal -x bash -c "echo 'Hello!'; sleep 4"