Вы можете использовать exec ./ваш-сценарий
.
Эмулятор терминала, такой как GNOME Terminal, завершает работу, когда завершается начальный процесс, запущенный внутри него, который обычно является оболочкой.
Если вы уже находитесь в терминале, и единственное, что вы хотите сделать перед выходом из этого терминала, - это запустить определенный скрипт (или программу), то это означает, что вам больше не нужна оболочка, которая работает в нем. Таким образом, вы можете использовать оболочку exec
встроенный для создания оболочки заменить себя с помощью процесса, созданного вашей командой.
- В случае вашего скрипта это другой процесс оболочки - точно так же, как второй процесс оболочки создается при запуске скрипта без
exec
.
Синтаксис таков exec команда
, например, exec ./ваш-сценарий
.
exec
: пример
Например, предположим, что у меня есть сценарий оболочки с именем count
, помеченный как исполняемый и расположенный в текущем каталоге. Он содержит:
#!/usr/bin/env bashfor i in {5..1}; do echo $i; sleep 1; done
И в терминале я запускаю:
exec ./count
При этом выводятся цифры 5
, 4
, 3
, 2
, и 1
, по одному в секунду, а затем окно терминала закрывается.
Если вы запустите это из чего-то другого, кроме первого процесса, запущенного в вашем терминале - например, если вы запустили bash
сначала запустите другой экземпляр оболочки - затем это вернет вас к оболочке, которая создала тот процесс, а не выход из терминала. (Это предостережение в равной степени относится и к exit
основанные на методах.)
Вы можете использовать ./ваш-сценарий; выход
.
Если вы не хотите, чтобы ваша оболочка заменяла себя новым процессом (через exec
), вы можете сказать ему, чтобы он оставался на месте, но выходил сам сразу после завершения нового процесса.
Чтобы сделать это, запустите свою команду и exit
команда, разделенная ;
таким образом, они могут быть даны в одной строке.
Синтаксис таков команда; выход
, например, ./ваш-сценарий; выход
.
команда; выход
против. команда && выход
Вы можете заметить, что это похоже на ./ваш-сценарий && выход
способ, предложенный в кос - это и химайла ответы. Разница в том, что:
-
&&
запускает вторую команду только в том случае, если первая команда сообщил, что это удалось путем возврата нулевого кода выхода.
-
;
выполняет вторую команду независимо от того, сообщила ли первая команда об успешном выполнении или нет.
Какой из них вам нужен, зависит от конкретной ситуации. Если команда завершится неудачей, хотите ли вы, чтобы вызывающая оболочка (и принимающий терминал) оставались в рабочем состоянии? Если это так, используйте &&
; если нет, используйте ;
.
Существует также команда || выход
, который завершает работу вызывающей оболочки только в том случае, если command
сообщается неудача.