![在各種終端模擬器的新實例中開啟命令](https://rvso.com/image/1451249/%E5%9C%A8%E5%90%84%E7%A8%AE%E7%B5%82%E7%AB%AF%E6%A8%A1%E6%93%AC%E5%99%A8%E7%9A%84%E6%96%B0%E5%AF%A6%E4%BE%8B%E4%B8%AD%E9%96%8B%E5%95%9F%E5%91%BD%E4%BB%A4.png)
我正在嘗試打開終端模擬器,同時向其傳遞複合命令。用於執行此操作的命令是什麼(兩個版本:終端機在完成後保持開啟或關閉)?
例如,對於xterm
終端機模擬器,該指令會xterm -e "ls; sleep 3"
建立一個新的xterm
GUI 窗口,列出目前目錄,等待 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
。它們的不同之處在於是否需要對期權價值進行報價。
除了 shell 限制之外,xterm 使用全部-e
作為命令的一部分過去的令牌。它們不需要如圖所示被引用(這構成一個標記)。 rxvt 遵循該行為(參見文件)。
根據命令傳遞到 shell 的方式,還有細微的差異; 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
看來我遇到的主要問題是,對於大多數終端模擬器來說,命令參數應該是單一專案(即,沒有 shell 樣式的解析)。例如
rxvt -e "ls; sleep 3"
失敗,即使這是xterm
調用相同的方式。
如果您嘗試取消引用它,那也不起作用。例如:
rxvt -e ls; sleep 3
被單獨解析和執行,作為兩個命令:
rxvt -e ls
sleep 3
使用我發現的技巧這裡,您可以呼叫終端模擬器來運行bash
,然後將命令傳遞給bash
解釋器而不是模擬器的解釋器。這既解決了問題,又具有更一致的行為,因為在所有情況下都是bash
解析主命令字串。
使用我發現的技巧這裡,您可以呼叫bash
for xterm
,從而使 shell 保持開啟狀態並產生持久變體:
rxvt -e bash -c "ls;sleep 3;bash"
這也適用於konsole
、lxterminal
和terminator
(terminator
至少-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"
剩下的問號我認為是不可能的。
請隨意使用任何新終端、新呼叫或更正來編輯此表。