Как запустить скрипт, не закрывая терминал?
У меня есть скрипт в файле bla.sh и это исполняемый файл. Когда я нажимаю на него, скрипт выполняется и окно закрывается. Я бы хотел, чтобы окно оставалось открытым.
Что-то вроде команды cmd /k** command в винде.
PS я не хочу использовать pause, но я хочу иметь возможность писать больше команд после выполнения скрипта.
9 ответов
Положил $SHELL в конце вашего сценария:

Небольшой недостаток: с gnome-terminal не работает bash поскольку это оболочка, она будет рассматривать его как приложение и отображать предупреждение об этом при попытке закрыть терминал:
There is still a process running in this terminal
Closing the terminal will kill it.
Я не нашел хорошего способа скрыть это предупреждение. Если вы хотите, вы можете полностью отключить его, запустив:
gconftool --set /apps/gnome-terminal/global/confirm_window_close --type boolean false
Этого не произойдет, если вы используете xterm вместо гном-терминала; если это вас беспокоит.
Использование терминала Gnome
Использование добавления gnome-терминала;bash в конце командной строки и вызов сценария с опцией -c. Например:
gnome-terminal -e "bash -c ~/script.sh;bash"
Это делает следующее:
- открывает гном-терминал
- выполняет скрипт script.sh
- показывает приглашение bash после завершения скрипта.
Вы можете выйти из окна терминала gnome, закрыв окно или набрав в командной строке bash команду exit. Или вы можете ввести больше команд по запросу.
Если у вас есть доступ к сценарию, вы также можете добавить следующий код в конце:
read
Этот код будет ждать ввода перед закрытием, поэтому терминал будет оставаться открытым, пока вы не нажмете Enter.
Использование bash"s --init-file вариант с временной трубой:
bash --init-file <(echo './<script_name>')
Пример:
bash --init-file <(echo './bla.sh')
Нет ответа
exec bashкак правильный ответ, но должно быть, так вот оно. Этот ответ заимствован частично из @ ответа Karsvo в, ответе @Stefano Palazo в и комментарии @Andrea Corbellini под ответом Стефано.
В моей системе
echo $SHELL показывает, что переменная SHELL содержит
/bin/bash. Следовательно, используя
bash на месте
$SHELLидентично. Кроме того, я определил, что все три из них в конце будут держать терминал открытым:
bash,
eval bash,
exec bash, но только последнее,
exec bash, позволит вам закрыть терминал без предупреждения о том, что процесс все еще запущен. Поэтому лучше всего использовать
exec bash или
exec $SHELL, как пишет @AndreaCorbellini в своем комментарии.
Вот как это может выглядеть в случае использования скрипта для открытия двух новых
gnome-terminal вкладки уже
cded в ваш $HOME (~) каталог:
gnome-terminal --tab -- bash -ic "cd ~; exec bash;"
gnome-terminal --tab -- bash -ic "cd ~; exec bash;"
Опять же, вы можете использовать
exec $SHELL здесь вместо этого:
gnome-terminal --tab -- bash -ic "cd ~; exec $SHELL;"
gnome-terminal --tab -- bash -ic "cd ~; exec $SHELL;"
Связанный:
- Вот почему мне ДЕЙСТВИТЕЛЬНО понадобилась эта информация! - Откройте Терминал с несколькими вкладками и запустите приложение
С помощью xterm и добавление ;bash в конце командной строки работает. Например:
xterm -e "bash ~/script.sh;bash"
Это делает следующее:
- открывает xterm
- выполняет скрипт
script.sh - показывает приглашение bash после завершения скрипта.
Вы можете выйти из окна xterm, закрыв окно или набрав exit в приглашении bash. Или вы можете ввести больше команд по запросу.
xterm -e bash --rcfile bla.sh
Это запустит скрипт в новом окне и даже даст вам контроль над окном после его завершения.
Однако новое окно не будет загружаться ~/.bashrc как обычно, так как мы побежали bla.sh вместо. Это можно исправить, поставив
. ~/.bashrc
на вершине bla.sh
Я обнаружил, что gnome-terminal немного плохо справляется с этой задачей, xterm более спокойно справляется с этой задачей, не вызывая вопросов. Например, я выполнил команду «дата», и она была ПОКРЫТА СИНИМ Всплывающим окном из терминала gnome, сообщающим, что дочерний процесс завершается нормально, что не позволяет мне увидеть вывод даты.
В Gnome-терминал следует добавить меню «Отключить все сообщения терминала».
ВАЖНО: вы должны находиться в каталоге выполнения, где находятся все зависимости от '.'
Введите это, и терминал останется в новом процессе:
xterm -fa Monospace -fs 10 -e "bash -c 'mycommand arg1 arg2 argn';bash" &