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

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

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

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

Поставь $SHELL в конце вашего сценария:

alt text

Небольшой недостаток: поскольку gnome-terminal не запускает bash поскольку это оболочка, она будет рассматривать его как приложение и отображение предупреждения об этом, когда вы пытаетесь закрыть терминал:

There is still a process running in this terminalClosing the terminal will kill it.

Я не нашел хорошего способа скрыть это предупреждение. Если вы хотите, вы можете полностью отключить его, запустив:

gconftool --set /apps/gnome-terminal/global/confirm_window_close --type boolean false

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

Использование Терминала Gnome

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

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

При этом выполняется следующее:

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

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

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

read

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

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

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

От:

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

С помощью 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

ДВУ;

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

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

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

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

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

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

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

Вот как это может выглядеть в случае использования скрипта для открытия двух новых gnome-terminal вкладки уже cdэд в твой ~/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-терминале повторно запустите свой ~/.bashrc файл с . ~/.bashrc, затем запустите эту команду с помощью:

open_default_tabs

... и вы увидите свою исходную вкладку gnome-terminal плюс две новые вкладки, причем обе из двух новых вкладок уже cdэд вошел в ~/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_dirchmod +x test.sh

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

./test.sh

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

Связанный:

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