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


Например, для эмулятора терминала 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"      |

Может ли кто-нибудь помочь мне заполнить больше? Частичные ответы приветствуются.

2 ответа2

0

Помимо cmd , все они являются эмуляторами X-терминала, и большинство из них предоставляют некоторые варианты опции -e в xterm. Различия между ними заключаются в том, требуется ли им указывать значение опции.

Помимо ограничений оболочки, xterm использует все токены после -e как часть команды. Их не нужно заключать в кавычки, как показано (что составляет один токен). rxvt следует этому поведению (см. документацию).

Есть также тонкие различия в зависимости от того, как команда передается в оболочку; xterm документирует кое-что из этого в руководстве (ищите "shell" и "filter"), в то время как другие не предоставляют такой уровень детализации. Вы можете найти их только путем чтения исходного кода или тестирования.

Согласно документации, konsole также следует поведению -e xterm (преобладающее соглашение).

GNOME-терминал отличается от конвенции (см. документацию):

--command CMD , -e CMD

Запускает команду CMD во время запуска.

--execute CMD ARGS , -x CMD ARGS

Выполняет команду CMD со своими аргументами ARGS при запуске. Никакие аргументы кроме этого не будут обработаны терминалом. Такое поведение имитирует поведение xterm -e.

То есть его опция -e ожидает один токен. Вместо того, чтобы изменить его для обеспечения совместимости, его разработчики решили предоставить аналогичную функциональность с другим именем опции.

Другие используют почти весь тот же код, что и gnome-терминал, и в зависимости от степени совместного использования могут реализовывать -e как другие или просто копировать из gnome-терминала:

lxterminal

-e STRING --command= STRING --command STRING

Эта опция указывает программу (и ее аргументы командной строки), которая будет запущена в терминале. За исключением формы --command =, это должна быть последняя опция в командной строке.

терминатор документации соответствует gnome-терминал

xfce4-терминал документация соответствует lxterminal.

0

Похоже, что основная проблема, с которой я столкнулся, заключалась в том, что для большинства эмуляторов терминала аргумент команды, как ожидается, будет одним элементом (т. Е. Не выполняется синтаксический анализ в стиле оболочки). Например

rxvt -e "ls; sleep 3"

терпит неудачу, хотя это так же, как xterm был вызван.

Если вы попытаетесь удалить его, это тоже не сработает. Например:

rxvt -e ls; sleep 3

анализируется и выполняется отдельно, как две команды:

rxvt -e ls
sleep 3

Используя трюк, который я нашел здесь, вы можете вызвать эмулятор терминала для запуска bash , а затем передать команды интерпретатору bash вместо эмулятора. Это и решает проблему, и имеет более согласованное поведение, поскольку во всех случаях bash анализирует основную командную строку.

Используя трюк, который я обнаружил здесь, вы можете вызвать bash для xterm , оставив оболочку открытой и создав постоянный вариант:

rxvt -e bash -c "ls;sleep 3;bash"

Это работает и для konsole , lxterminal и terminator (terminator по крайней мере, также поддерживает -x кажется). Однако, если вы думаете об этом (или используете эквивалент gnome-terminal -x а затем наблюдаете предупреждение при попытке закрыть окно), вы понимаете, что на терминале работает bash , и что этот bash выполняет bash . Вместо этого, вы хотите заменить bash -that's продолжающийся к прекратить с bash -Вот-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"                 

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .