Открытие команды в новом экземпляре различных эмуляторов терминала

Открытие команды в новом экземпляре различных эмуляторов терминала

Я пытаюсь открыть эмулятор терминала, одновременно передавая ему составную команду. Какие команды для этого существуют (два варианта: когда терминал остается открытым после завершения или когда он закрывается)?


Например, для 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:

lxтерминал

-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анализирует основную командную строку.

Используя трюк, который я нашелздесь, вы можете вызвать bashfor 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"                 

Остальные вопросительные знаки я не считаю возможными.

Не стесняйтесь редактировать эту таблицу, добавляя новые терминалы, новые вызовы или исправления.

Связанный контент