![Открытие команды в новом экземпляре различных эмуляторов терминала](https://rvso.com/image/1451249/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20%D0%B2%20%D0%BD%D0%BE%D0%B2%D0%BE%D0%BC%20%D1%8D%D0%BA%D0%B7%D0%B5%D0%BC%D0%BF%D0%BB%D1%8F%D1%80%D0%B5%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D1%85%20%D1%8D%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB%D0%B0.png)
Я пытаюсь открыть эмулятор терминала, одновременно передавая ему составную команду. Какие команды для этого существуют (два варианта: когда терминал остается открытым после завершения или когда он закрывается)?
Например, для xterm
эмулятора терминала команда xterm -e "ls; sleep 3"
создает новое xterm
окно графического интерфейса, выводит список текущего каталога, ждет 3 секунды, а затем закрывает окно.
Меня особенно интересуют вызовы для gnome-terminal
, konsole
, lxterminal
, rxvt
, terminator
, xfce4-terminal
и xterm
, а также для Windows cmd
.
Вот несколько примеров использования того, что я понял самостоятельно на данный момент:
Emulator | Invocation (Exiting) | Invocation (Persistent) |
----------------+------------------------------------+------------------------------------+
cmd | start CMD /C "DATE /T & TIME /T" | start CMD /K "DATE /T & TIME /T" |
gnome-terminal | ??? | ??? |
konsole | ??? | ??? |
lxterminal | ??? | ??? |
rxvt | ??? | ??? |
terminator | ??? | ??? |
xfce4-terminal | ??? | ??? |
xterm | xterm -e "ls; sleep 3" | xterm -e "ls; sleep 3; bash" |
Может кто-нибудь помочь мне заполнить больше? Частичные ответы приветствуются.
решение1
За исключением cmd
, все они являются эмуляторами X-терминала, и большинство из них предоставляют некоторые вариации опции xterm -e
. Отличие заключается в том, требуют ли они заключать значение опции в кавычки.
Помимо ограничений оболочки, xterm используетвсетокенов, прошедших -e
как часть команды. Их не нужно заключать в кавычки, как показано (что делает один токен). rxvt следует этому поведению (см.документация).
Существуют также тонкие различия в том, как команда передается в оболочку; xterm документирует некоторые из них вруководство(ищите "shell" и "filter"), в то время как ни один из других не обеспечивает такого уровня детализации. Вы можете найти толькотепутем чтения исходного кода или тестирования.
В соответствии сдокументация, konsole также следует -e
поведению xterm (преобладающее соглашение).
gnome-terminal отличается от соглашения (см.документация):
--command
КМД, -e
КМДЗапускаетКМДкоманда во время запуска.
--execute
КМД АРГС, -x
КМД АРГСВыполняет командуКМДс его аргументамиАРГСпри запуске. Никакие аргументы, кроме этого, терминалом обрабатываться не будут. Такое поведение имитирует поведение xterm -e.
То есть, его -e
вариант ожидает один токен. Вместо того, чтобы изменить его, чтобы обеспечить совместимость, его разработчики решили предоставитьпохожийфункциональность с другим названием опции.
Остальные используют почти весь тот же код, что и gnome-terminal, и в зависимости от степени совместного использования могут реализовывать его -e
так же, как и другие, или просто копировать из gnome-terminal:
-e
НИТЬ--command=
НИТЬ--command
НИТЬЭта опция указывает программу (и ее аргументы командной строки), которая будет запущена в терминале. За исключением формы --command=, это должна быть последняя опция в командной строке.
терминатордокументациясоответствует gnome-терминалу
xfce4-терминалдокументациясоответствует lxterminal.
решение2
Похоже, что основная проблема, с которой я столкнулся, заключалась в том, что для большинства эмуляторов терминала аргумент команды должен быть одним элементом (т.е. нет разбора в стиле оболочки). Например
rxvt -e "ls; sleep 3"
не удается, хотя это тот же самый способ, xterm
которым был вызван.
Если вы попытаетесь снять кавычки, это тоже не сработает. Например:
rxvt -e ls; sleep 3
анализируется и выполняется отдельно, как две команды:
rxvt -e ls
sleep 3
Используя трюк, который я нашелздесь, вы можете вызвать эмулятор терминала для запуска bash
, а затем передать команды bash
интерпретатору , а не эмулятору. Это решает проблему и имеет более последовательное поведение, поскольку во всех случаях это that bash
анализирует основную командную строку.
Используя трюк, который я нашелздесь, вы можете вызвать bash
for xterm
, тем самым оставив оболочку открытой и создав тем самым постоянный вариант:
rxvt -e bash -c "ls;sleep 3;bash"
Это работает для konsole
, lxterminal
, и terminator
тоже ( terminator
по крайней мере, также поддерживает -x
это). Однако, если вы подумаете об этом (или используете gnome-terminal
эквивалент -x
, а затем увидите предупреждение, когда попытаетесь закрыть окно), вы поймете, что терминал работает bash
, и что это bash
работает bash
. Вместо этого вы хотитезаменять-that's bash
-going-to-terminate на bash
-that-won't:
rxvt -e bash -c "ls;sleep 3;exec bash"
Это можно увидеть в дикой природе.здесь.
Примечаниеальтернативаэто xterm
опция -hold
, которая имеет эквиваленты на некоторых других терминалах (например konsole
, --hold
). Опция hold предотвращает закрытие эмулятора терминала, но не возвращает интерактивность. Это было не совсем то, что я искал, но я перечислил это ниже для полноты.
Вот таблица (другой формат, так как эти команды становятся длиннее). Я также добавил urxvt
. Все вызовы были протестированы:
Emulator | Command Type | Invocation
---------------+---------------------+-------------------------------------------------
cmd | exiting | start CMD /C "DATE /T & TIME /T"
| persistent | ???
| persistent (inter.) | start CMD /K "DATE /T & TIME /T"
---------------+---------------------+-------------------------------------------------
gnome-terminal | exiting | gnome-terminal -x bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | gnome-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
konsole | exiting | konsole -e bash -c "ls;sleep 3"
| persistent | konsole --hold -e bash -c "ls;sleep 3"
| persistent (inter.) | konsole -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
lxterminal | exiting | lxterminal -e bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | lxterminal -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
rxvt | exiting | rxvt -e bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | rxvt -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
terminator | exiting | terminator -x bash -c "ls;sleep 3"
| persistent | ???
| persistent (inter.) | terminator -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
urxvt | exiting | urxvt -e bash -c "ls;sleep 3"
| persistent | urxvt -hold -e bash -c "ls;sleep 3"
| persistent (inter.) | urxvt -e bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xfce4-terminal | exiting | xfce4-terminal -x bash -c "ls;sleep 3"
| persistent | xfce4-terminal --hold -x bash -c "ls;sleep 3"
| persistent (inter.) | xfce4-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xterm | exiting | xterm -e "ls;sleep 3"
| persistent | xterm -hold -e "ls; sleep 3"
| persistent (inter.) | xterm -e "ls;sleep 3;exec bash"
Остальные вопросительные знаки я не считаю возможными.
Не стесняйтесь редактировать эту таблицу, добавляя новые терминалы, новые вызовы или исправления.