С помощью модуля запуска для приложения терминала, как я могу держать терминал открытым после завершения программы?
У меня есть команда терминала, которую я запускаю из панели запуска приложений. Это прекрасно работает, однако иногда команда не выполняется, поэтому я хотел бы, чтобы терминал оставался открытым, чтобы я мог видеть результаты. Как я могу это сделать?
9 ответов
Предполагая, что ваша команда называется mycommand
Я бы поменял мой лаунчер для запуска этого:
gnome-terminal -e "mycommand|less"
Если вы хотите более постоянное, возможно, более чистое решение, откройте gnome-терминал, перейдите в меню "Правка", "Параметры профиля" и нажмите вкладку "Заголовок и команда". Измените параметр "Когда команда выходит" на "Держать терминал открытым".
Когда вы выполняете команды, он должен оставить терминал открытым, когда что-то запускается.
Редактировать: Если вы действительно не заботитесь о терминале, вы можете просто использовать флаг удержания xterm:
xterm -e "mycommand" hold
В вашем ярлыке.desktop используйте это
Exec=gnome-terminal -x bash -c "YOUR_SCRIPT; exec $SHELL"
После того, как ваш скрипт завершится, процесс Bash заменит себя новым вызовом самого себя.
Если вам нужно передать аргументы в кавычках в ваш скрипт, вы должны экранировать кавычки:
Exec=gnome-terminal -x bash -c "YOUR_SCRIPT \"arg with spaces\"; exec $SHELL"
Ваш лаунчер запускает скрипт правильно?
В конце вашего сценария добавьте
read -p "Press any key to exit > " -n1 junk
echo
Тогда ваш сценарий будет ждать, пока вы не решите его завершить.
Немного отличается от других ответов: запустите команду и, если это не удастся, создайте оболочку. Таким образом, вам не нужно держать терминал открытым (что не различает успех или неудачу команды), и вы можете найти эту оболочку особенно полезной при сбое. Чтобы закрыть его, просто используйте Ctrl-D (EOF), "выход", Alt-F4 (или все, что ваш оконный менеджер использует для закрытия окон) и т. Д.
Успех или скорлупа
#!/bin/sh
[ $# -eq 0 ] && {
echo "$(basename $0): no command" >&2
exit 1
}
"$@" || {
echo "failed: $?"
exec $SHELL
}
Поместите этот файл где-нибудь, например, ~/bin, затем используйте "success-or-shell your original command" в своей панели запуска.
На этот вопрос есть хороший ответ, который сработал для меня.
Короче говоря: у каждого эмулятора терминала есть свой способ держать свое окно открытым при выходе из команды.
Если вы хотите использовать конкретное терминальное приложение , вы можете добавить соответствующий параметр командной строки, который он предоставляет, если он присутствует, например
roxterm --hold
. Или только для собственного использования, вы можете переключить параметр в окне настроек для этого эмулятора (например, «оставлять окно открытым после выхода из команды»).
Если вы хотите использовать терминальное приложение по умолчанию (например, через x-terminal-emulator или exo-open), вам нужно использовать трюк в самом скрипте: открыть другую оболочку в конце, например
...; bash
.
Это также хорошо работает для приложений с функцией «Пользовательское действие», таких как Application Finder (xfce4-appfinder) и Thunar. Например:
Тунар
Name: Show Path in Terminal
Command: exo-open --launch TerminalEmulator bash -c "echo '%f';bash"
Поиск приложений
Pattern: $
Command: exo-open --launch TerminalEmulator bash -c "%s;bash"
В приведенных выше примерах
exo-open --launch TerminalEmulator
открывает эмулятор терминала по умолчанию, и все после этого читается как команда для запуска.
bash -c
запускает новый процесс оболочки bash с указанной командой.
"...;bash"
это команда, которая по завершении запускает новый процесс оболочки bash, который держит окно терминала открытым.
Еще идея добавить
sleep 36500d
до конца сценария, что дает вам 100 лет на просмотр результата.
Вы также можете заставить свой сценарий прослушивать сигнал закрытия терминала и переопределять (или «ловить») его.
Вход на рабочий стол
Exec=exo-open --launch TerminalEmulator bash -c "function handle_sigint() { echo 'SIGINT received... but I will not close by myself.'; }; trap 'handle_sigint' 0; while true; do echo 'Running script...'; sleep 1; done;"
Все это работает для файла сценария. К сожалению, у меня не получается заставить что-либо из вышеперечисленного работать с файлом входа на рабочем столе (.desktop).
Этот ответ дает лучший ответ, который я когда-либо видел, делать то, что вы хотите. Они рекомендуют создать скрипт с командами для выполнения и использовать его с параметром --init-file (специфично для bash, но вы, вероятно, могли бы сделать то же самое для csh/tcsh/zsh и т. Д.):
#!/bin/bash --init-file
commands to run
... и выполнить его как:
xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang
Использовать watch
команда.
Формат: watch -n60 myCommand
, или же watch -n60 "my command string"
-
-n
указывает количество секунд ожидания между вызовами к myCommand; Пример: вышеупомянутая команда будет вызывать myCommand каждые 60 секунд, навсегда. - Если команда состоит из нескольких слов, поместите ее в двойные кавычки:
"my command string"
,
Допустим, вы хотите Launcher, который отображает использование диска и остается открытым для просмотра читателем. Я бы просто использовал эту команду внутри Launcher: watch -n60 "df -h"
, который вызывает df -h
теперь каждые 60 секунд.
Мне нравится это за принятый ответ gnome-terminal -e "mycommand|less"
потому что я использую Xubuntu, который по умолчанию использует другой терминал.
AFAIK, терминал не будет оставаться открытым, если вы не используете опцию «удерживать» для соответствующего эмулятора терминала.
Например, для xfce4-терминала, чтобы сделать пусковую установку (пункт меню), которая выполняет какую-либо команду в окне терминала, которое должно оставаться открытым даже после завершения выполнения команды, необходимо использовать следующую команду для пусковой установки /пункт меню:
xfce4-terminal -H -e 'put command to execute here'
(-H — это флаг удержания, необходимый для предотвращения закрытия окна терминала после выполнения команды.
Флаг -e заставляет терминал выполнять команду в строке, следующей за -e при запуске терминала)