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

Я также сталкивался с этой проблемой, и я провел почти 2 часа в Интернете в поисках решений. Вы были на правильном пути, yaboot это правильное место, чтобы посмотреть. Однако есть еще кое-что, прежде чем мы избавимся от этого бесполезного монитора.

Я нашел разговор по электронной почте, который решает нашу проблему. Я не слишком уверен, что вы решили свою проблему, но для блага других я опубликую решение и ссылку здесь. (Просто потому, что Google считает, что здесь есть решение ...)

Ссылка: http://comments.gmane.org/gmane.linux.ports.ppc.embedded/34058 [ 114]

В случае, если срок действия ссылки истекает, вот копия и вставка:

Кредит идет: Romain Goyet написал 24 марта 2010 11:32

[ 110]

18
задан 22.04.2015, 19:55

7 ответов

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

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

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

gnome-open <path_to_pdf_file> && exit

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

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

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

<path_to_script> && exit

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

./<script> && exit

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

kill -9 $PPID

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

12
ответ дан 04.10.2019, 19:16
  • 1
    Сигнал SIGTERM отправляется в процесс для запроса его завершения. В отличие от сигнала SIGKILL, это может быть поймано и интерпретировано или проигнорировано процессом. Это позволяет процессу выполнять хорошие средства высвобождающего завершения и сохранение состояния в подходящих случаях. SIGINT почти идентичен SIGTERM. – Ozair Kafray 21.04.2015, 04:42
  • 2
    @A.B. You' право ре, SIGTERM вот недостаточно. – wajiw 21.04.2015, 04:45
  • 3
    Спасибо за ответ. Я предполагаю, плохо просто используют единственную команду, которую Вы дали в своем ответе – Firo 22.04.2015, 21:00
  • 4
    уничтожьте $PPID, делает то же как выход - ничто. И уничтожьте-9$PPID, закрывает все дочерние окна наряду с родителем. – wajiw 25.07.2017, 16:07

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

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

проблема, если несколько терминалов будут открыты, и это дочерние процессы 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
ответ дан 04.10.2019, 19:16
  • 1
    Я думаю $$ команды get' s изодромный с предварением из терминала... Это было бы альтернативой? Вы могли также объяснить, как отрицать? – Robert Audi 21.04.2015, 02:59
  • 2
    Как этот сценарий делает это? Я являюсь все еще новым для окружения сценариев, таким образом, я не могу действительно понять те команды. Вы могли объяснить, как это закрывает терминал – wajiw 21.04.2015, 03:10
  • 3
    @Tim нет, это возвращает оболочку в терминале: ps xa | grep $ = > 4381 pts/0 Ss 0:01 /usr/bin/zsh – I159 21.04.2015, 03:39
  • 4
    @RumeshSudhaharan Это уничтожает все окно терминала, в котором сценарий запускается, но никакие другие окна терминала. – Johnson 21.04.2015, 04:36
  • 5
    @A.B. Вы ранее сказали, что это только уничтожает текущее окно терминала и не любых из других. Я использовал этот сценарий сегодня с двумя открытыми окнами терминала, и они оба были уничтожены, как только я выполнил сценарий. – Robert Lujo 22.04.2015, 20:02

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

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

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

  • В случае Вашего сценария, это - другой процесс оболочки - так же, как, как 1135-секундное процесс оболочки создается, когда Вы запускаете скрипт без 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 сначала для запуска другого экземпляра оболочки - затем, это возвращает Вас оболочке, которая создала что процесс, вместо того, чтобы выйти из терминала. (Этот протест применяется одинаково к [1 115] - базирующиеся методы.)

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

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

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

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

command; exit по сравнению с [1 123]

можно заметить, что это выглядит подобным ./your-script && exit метод, предложенный в [1 131] Кос и heemayl's ответы. Различие то, что:

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

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

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

4
ответ дан 04.10.2019, 19:16

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

$ cat run.sh
exit;
$ ./run.sh #will not close
$ . ./run.sh # will close
2
ответ дан 04.10.2019, 19:16

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

xdg-open file.pdf && exit

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

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

0
ответ дан 04.10.2019, 19:16
  • 1
    Я думаю, что он сказал выход wasn' t работа... – Hauke 21.04.2015, 05:09
  • 2
    @Tim: Возможно, OP не использовал его правильный путь от вопроса его очень неясное мне, как он помещал exit в конец и не работал.. – Tarun Uday 21.04.2015, 05:13
  • 3
    @Tim, поскольку OP поместила exit внутренняя часть сценарий, который неполезен, потому что это имеет эффект выхода bash экземпляр, в котором сценарий выполняется скорее тогда родитель bash экземпляр (тот, связанный с Терминалом), который заставил бы Терминал закрываться вместо этого – zeta 21.04.2015, 08:54
  • 4
    Так или иначе xdg-open выполнения уже в фоновом режиме и расцепляемый от Терминал, таким образом, Вы don' t потребность nohup здесь, плюс от того, что я понимаю выполнения OP xdg-open многократно в сценарии к пакетно-открытому несколько файлов, с помощью xdg-open как эта внутренняя часть, из которой сценарий заставил бы сценарий выходить в первом xdg-open происшествие – A-B-B 21.04.2015, 09:04
  • 5
    @kos: Нет, я не работаю xdg-open в backgr, даже если я имел nohup, по различной причине & должен ли быть.. любой фоновый процесс от инициирующего терминала будет уничтожен при уничтожении родительского терминала.. nohup там для предотвращения его.. как я don' t должен использовать терминал в интерактивном режиме снова, нет никакой потребности поместить процесс в bg.. на Вашей 2-й точке, которая может также быть предотвращена путем выполнения каждого xdg-open && exit в подоболочке.. – Stefano Sanfilippo 21.04.2015, 09:12

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

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

1
ответ дан 04.10.2019, 19:16
  • 1
    В моем случае, с тех пор nohup игнорирует сигнал зависания, nohup xdg-open some_program работал на меня, и exit было ненужным. nohup перенаправления обмениваются сообщениями к nohup.out файл: nohup: ignoring input and appending output to nohup.out – CJ Travis 13.09.2019, 04:36

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

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

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

, не смотря на детали, что делает сценарий, скрипт может быть непосредственно запущен в терминале с опцией -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
ответ дан 04.10.2019, 19:16

Теги

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