Как запустить скрипт, не закрывая терминал?
У меня есть скрипт в файле 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
вкладки уже
cd
ed в ваш $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" &