在各種終端模擬器的新實例中開啟命令

在各種終端模擬器的新實例中開啟命令

我正在嘗試打開終端模擬器,同時向其傳遞複合命令。用於執行此操作的命令是什麼(兩個版本:終端機在完成後保持開啟或關閉)?


例如,對於xterm終端機模擬器,該指令會xterm -e "ls; sleep 3"建立一個新的xtermGUI 窗口,列出目前目錄,等待 3 秒,然後關閉該視窗。

gnome-terminal我對、konsolelxterminalrxvtterminatorxfce4-terminalxterm以及 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。它們的不同之處在於是否需要對期權價值進行報價。

除了 shell 限制之外,xterm 使用全部-e作為命令的一部分過去的令牌。它們不需要如圖所示被引用(這構成一個標記)。 rxvt 遵循該行為(參見文件)。

根據命令傳遞到 shell 的方式,還有細微的差異; xterm 記錄了其中的一些內容手動的(尋找“shell”和“filter”),而其他人都沒有提供這種程度的詳細資訊。你只能找到那些透過閱讀原始碼或測試。

根據文件,konsole 也遵循-exterm(現行約定)的行為。

gnome-terminal 與約定不同(參見文件):

--command指令管理系統, -e指令管理系統

運行指令管理系統啟動時的命令。

--execute指令管理系統 輔助生殖系統, -x指令管理系統 輔助生殖系統

執行命令指令管理系統及其論據輔助生殖系統啟動時。終端機不會處理超出此參數的任何參數。此行為模仿 xterm -e 行為。

也就是說,它的-e選項需要一個令牌。它的開發人員沒有修改它以提供相容性,而是選擇提供相似的具有不同選項名稱的功能。

其他人幾乎使用與 gnome-terminal 相同的程式碼,並且根據共享的程度,可以-e像其他人一樣實現,或者只是從 gnome-terminal 複製:

LX終端

-e細繩--command=細繩--command細繩

此選項指定要在終端機中執行的程式(及其命令列參數)。除了 --command= 形式之外,這必須是命令列上的最後一個選項。

終結者文件匹配 gnome 終端

xfce4-終端文件匹配 lxterminal。

答案2

看來我遇到的主要問題是,對於大多數終端模擬器來說,命令參數應該是單一專案(即,沒有 shell 樣式的解析)。例如

rxvt -e "ls; sleep 3"

失敗,即使這是xterm調用相同的方式。

如果您嘗試取消引用它,那也不起作用。例如:

rxvt -e ls; sleep 3

被單獨解析和執行,作為兩個命令:

rxvt -e ls
sleep 3

使用我發現的技巧這裡,您可以呼叫終端模擬器來運行bash,然後將命令傳遞給bash解釋器而不是模擬器的解釋器。這既解決了問題,又具有更一致的行為,因為在所有情況下都是bash解析主命令字串。

使用我發現的技巧這裡,您可以呼叫bashfor xterm,從而使 shell 保持開啟狀態並產生持久變體:

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

這也適用於konsolelxterminalterminatorterminator至少-x看起來也支持)。但是,如果您考慮一下(或使用gnome-terminal等效項-x,然後在嘗試關閉視窗時觀察警告),您就會意識到終端正在運行bash,並且正在bash運行bash。相反,你想要代替the bash-that's-going-to-terminate with a bash-that-won't:

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

這個可以在野外看到這裡

筆記替代isxterm-hold選項,在其他一些終端上有等效的選項(例如konsole's --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"                 

剩下的問號我認為是不可能的。

請隨意使用任何新終端、新呼叫或更正來編輯此表。

相關內容