Похоже, что основная проблема, с которой я столкнулся, заключалась в том, что для большинства эмуляторов терминала аргумент команды, как ожидается, будет одним элементом (т. Е. Не выполняется синтаксический анализ в стиле оболочки). Например
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"
Остальные вопросительные знаки я не считаю возможными.
Не стесняйтесь редактировать эту таблицу с любыми новыми терминалами, новыми вызовами или исправлениями.