Как запустить скрипт, не закрывая терминал?

У меня есть скрипт в файле 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"

Это делает следующее:

  1. открывает гном-терминал
  2. выполняет скрипт script.sh
  3. показывает приглашение bash после завершения скрипта.

Вы можете выйти из окна терминала gnome, закрыв окно или набрав в командной строке bash команду exit. Или вы можете ввести больше команд по запросу.

Если у вас есть доступ к сценарию, вы также можете добавить следующий код в конце:

read

Этот код будет ждать ввода перед закрытием, поэтому терминал будет оставаться открытым, пока вы не нажмете Enter.

Использование bash"s --init-file вариант с временной трубой:

bash --init-file <(echo './<script_name>')

Пример:

bash --init-file <(echo './bla.sh')

Если вы используете xterm использование -hold,

Нет ответа 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;"

Связанный:

  1. Вот почему мне ДЕЙСТВИТЕЛЬНО понадобилась эта информация! - Откройте Терминал с несколькими вкладками и запустите приложение

С помощью xterm и добавление ;bash в конце командной строки работает. Например:

xterm -e "bash ~/script.sh;bash"

Это делает следующее:

  1. открывает xterm
  2. выполняет скрипт script.sh
  3. показывает приглашение 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" &
Другие вопросы по тегам