Вы можете использовать .exec ./your-script
Эмулятор терминала, такой как GNOME Terminal, завершает работу, когда завершается начальный процесс, выполняющийся внутри него - обычно это оболочка.
Если вы уже находитесь в терминале, и единственное, что вы хотите сделать перед выходом из этого терминала, это запустить определенный скрипт (или программу), то это означает, что вам больше не нужна оболочка, которая в нем работает. Таким образом, вы можете использовать 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
Вы можете заметить , это выглядит так же, метод , предложенный в Kos игровых и heemayl - х ответы. Разница в том, что:./your-script && exit
&&
запускает вторую команду только в том случае, если первая команда сообщила, что ей это удалось , вернув нулевой код завершения .
;
запускает вторую команду независимо от того, сообщила ли первая команда об успешном выполнении.
Какой вы хотите, зависит от конкретной ситуации. Если команда не выполняется, вы хотите, чтобы вызывающая оболочка (и хост-терминал) продолжали работать? Если так, используйте &&
; если нет, используйте ;
.
Существует также command || exit
, который выходит из вызывающей оболочки только в случае command
сообщения о сбое .