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

У меня есть скрипт в файле bla.sh, и он исполняемый. Когда я нажимаю на нем , сценарий выполняется и окно закрывается. Я бы хотел , чтобы окно оставалось открытым .

Что-то вроде команды cmd /k** command в Windows.

P.S. Я не хочу использовать pause, но хочу написать больше команд после выполнения скрипта.

82
задан 29 January 2013 в 14:02

8 ответов

Положите $SHELL в конец вашего скрипта:

alt text

Небольшой недостаток: так как gnome-терминал не запускает 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

Этого не произойдет, если вместо gnome-терминала использовать xterm; если это вас беспокоит.

94
ответ дан 29 January 2013 в 14:02

Using Gnome Terminal

Using gnome-terminal appending ;bash at the end of the command string and calling the script with -c options works. Например:

gnome-terminal -e "bash -c ~/script.sh;bash"

Так происходит следующее:

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

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

15
ответ дан 29 January 2013 в 14:02

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

7
ответ дан 29 January 2013 в 14:02

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

read

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

10
ответ дан 29 January 2013 в 14:02

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

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

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

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

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

2
ответ дан 29 January 2013 в 14:02

Используйте ] bash - параметр init-файла с временным конвейером:

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

Пример:

bash --init-file <(echo './bla.sh')
8
ответ дан 29 January 2013 в 14:02
xterm -e bash --rcfile bla.sh

Это запустит сценарий в новом окне и даже даст вам возможность управлять окном после его завершения.

Однако новое окно не загрузится ~ / .bashrc как обычно, поскольку вместо этого мы запустили bla.sh . Это можно исправить, поместив

. ~/.bashrc

в начало bla.sh

2
ответ дан 29 January 2013 в 14:02

TL; DR;

Используйте exec bash; или exec $ SHELL; в конце команды, чтобы держать терминал открытым после запуска

Подробная информация и пример тестового кода

Не существует ответа, показывающего exec bash как правильный ответ, но он должен быть, так что вот он. Этот ответ частично заимствован из ответа @ Karsvo , ответа @Stefano Palazo и комментария @Andrea Corbellini под ответом Стефано.

В моей системе (последний раз проверялся и проверялся) в Ubuntu 20.04), echo $ SHELL показывает, что переменная SHELL содержит / bin / bash . Однако где bash показывает, что исполняемый файл bash находится в / usr / bin / bash . НО, / user / bin / bash и / bin / bash являются идентичными исполняемыми файлами, что подтверждается наличием одинаковых sha256sum :

$ which bash
/usr/bin/bash

$ sha256sum $(which bash)
04a484f27a4b485b28451923605d9b528453d6c098a5a5112bec859fb5f2eea9  /usr/bin/bash

$ sha256sum $SHELL
04a484f27a4b485b28451923605d9b528453d6c098a5a5112bec859fb5f2eea9  /bin/bash

Следовательно, использование bash вместо $ SHELL идентичен. Кроме того, я определил, что все три из них в конце будут держать терминал открытым: bash , eval bash , exec bash , , но только последний, exec bash , позволит вам закрыть терминал без предупреждения о том, что процесс все еще запущен. Поэтому лучше всего использовать exec bash или exec $ SHELL , как говорит @AndreaCorbellini в своем комментарии.

Тест 1: это будет работать, как ожидалось

Вот что это может выглядеть так в случае использования сценария для открытия двух новых gnome-terminal вкладок, уже cd ed в вашем каталоге ~ / some_dir :

Добавьте в конец вашего ~ / .bashrc файла:

open_default_tabs() {
    gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec bash;"
    gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec bash;"
}

ИЛИ: опять же, вы можете использовать exec $ SHELL вместо этого:

open_default_tabs() {
    gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec $SHELL;"
    gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec $SHELL;"
}

Затем в любой gnome-terminal уже открыт, переустановите свой ~ / .bashrc файл с . ~ / .bashrc , затем запустите эту команду с:

open_default_tabs

... и вы увидите исходную вкладку gnome-terminal плюс две новые вкладки, причем обе две новые вкладки уже cd ed в каталог ~ / some_dir .

Если вы удалите exec bash; или exec $ SHELL; часть с конца каждого из однако приведенные выше команды, а затем повторно загрузите ваш файл ~ / .bashrc с . ~ / .bashrc , затем снова запустите команду open_default_tabs , вы увидите, что вкладки мигают, открываясь, а затем немедленно закрываясь. Все, что вы увидите, это пара быстрых вспышек. Часть exec bash; или exec $ SHELL; в конце требуется, чтобы эти новые вкладки оставались открытыми.

Тест 2: это доказывает, что exec bash; работает. НО, поведение gnome-terminal не совсем такое, как ожидалось. Чтобы решить эту проблему, см. Мои более-сложный ответ и обходной путь в моем другом ответе здесь .

В test.sh :

gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec bash;"
gnome-terminal --tab -- bash -ic "cd ~/some_dir; exec bash;"

Убедитесь, что some_dir существует, и сделайте test.sh исполняемый файл:

mkdir -p ~/some_dir
chmod +x test.sh

Запустите его:

./test.sh

Обратите внимание на два окна (не вкладки, в данном случае из-за проблемы в gnome-terminal ), которые были только что открыты оставаться открытым . Удалите exec bash; выше, и вы увидите, что они не закрываются - они мгновенно закрываются - так быстро, что вы даже не увидите их открывающихся. Это доказывает, что exec bash; работает отлично. Поведение gnome-terminal не совсем такое, как ожидалось, но это не имеет ничего общего с exec bash; , который отлично работает. Опять же, см. мой другой ответ здесь для полного решения проблемы, специфичной для gnome-terminal в этом случае.

Связано:

  1. Вот почему я ДЕЙСТВИТЕЛЬНО нуждался эта информация! Это мой «другой ответ», о котором я упоминал выше: Откройте терминал с несколькими вкладками и выполните приложение
1
ответ дан 5 January 2021 в 23:56

Другие вопросы по тегам:

Похожие вопросы: