У меня есть скрипт в файле bla.sh
, и он исполняемый. Когда я нажимаю на нем , сценарий выполняется и окно закрывается. Я бы хотел , чтобы окно оставалось открытым .
Что-то вроде команды cmd /k** command
в Windows.
P.S. Я не хочу использовать pause
, но хочу написать больше команд после выполнения скрипта.
Положите $SHELL
в конец вашего скрипта:
Небольшой недостаток: так как 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
; если это вас беспокоит.
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"
Так происходит следующее:
Вы можете выйти из окна gnome-терминала, закрыв окно, или набрав выход в bash-сказке. Или вы можете ввести больше команд по запросу.
Если вы используете xterm
, используйте -hold
.
Если у вас есть доступ к скрипту, то в конце можно добавить следующий код:
read
Этот код будет ждать ввода перед закрытием, поэтому терминал будет оставаться открытым до тех пор, пока вы не нажмете Enter.
Использование xterm
и добавление ;bash
в конце командной строки работает. Например:
xterm -e "bash ~/script.sh;bash"
Это делает следующее:
script.sh
Вы можете выйти из xterm окна, закрыв окно, или набрать exit
в bash prompt. Или вы можете ввести дополнительные команды по запросу.
Используйте ] bash
- параметр init-файла
с временным конвейером:
bash --init-file <(echo './<script_name>')
Пример:
bash --init-file <(echo './bla.sh')
xterm -e bash --rcfile bla.sh
Это запустит сценарий в новом окне и даже даст вам возможность управлять окном после его завершения.
Однако новое окно не загрузится ~ / .bashrc
как обычно, поскольку вместо этого мы запустили bla.sh
. Это можно исправить, поместив
. ~/.bashrc
в начало bla.sh
Используйте 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 в своем комментарии.
Вот что это может выглядеть так в случае использования сценария для открытия двух новых 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;
в конце требуется, чтобы эти новые вкладки оставались открытыми.
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
в этом случае.