打開 xterm 以外的終端,在其上執行命令,成功完成後不關閉終端
我的 Arch Linux 機器中有以下腳本:
#!/bin/bash xterm -e "sudo pacman -Syu;bash"
這將啟動一個 xterm 並在其
sudo pacman -Syu
上執行命令。由於;bash
部分原因,一旦命令完成,它不會關閉 xterm 視窗。這是用於更新我的系統的命令,我不希望它關閉,因為我想查看輸出。為什麼這不適用於其他終端,尤其是 lxterminal 和 roxterm(我嘗試過的唯一其他終端)?
lxterminal
使用或roxterm
代替的完全相同的命令xterm
將啟動終端並在命令執行後立即關閉它。
根本問題是基於 VTE 的終端不像xterm*那樣處理命令行。*除了(本討論中不必要的)保留選項可能存在的問題之外。
此命令中的引號
xterm -e "sudo pacman -Syu;bash"
是問題。引用的字元串是單個標記,作為單個參數傳遞給 xterm。
使用 xterm,之後的標記
-e
首先被嘗試作為 execv 呼叫的參數。如果做不到這一點,它會嘗試類似"${SHELL:-sh}" -c "parameters"
(執行您首選的 shell 以解釋parameters
為命令行)。konsole 做一個或另一個(可能是第一個,因為這是 xterm 的原始行為,並且 konsole 的大部分設計都可以追溯到 1990 年代後期)。當為 luit 修改 xterm 時,“失敗”替代方法有助於將參數傳遞給 luit。一段時間以來,基於 VTE 的終端嘗試在一個命令行選項中執行一個方面,而在另一個選項中執行另一個方面(我記得,
-e
和-x
,但是交換了兩個選項的角色和一個有趣的 Debian 錯誤報告的主題我暫時看不到)。在目前版本中,嘗試gnome-terminal -e "sudo pacman -Syu;bash"
失敗,因為它只適用於原始的類似 xterm 的行為。並且(請記住,其他終端使用較舊版本的 VTE),因為 gnome-terminal 的開發人員(與 VTE 開發人員重疊……)不久前放棄了該
-x
選項,該選項不適用於該命令。 這是有效的,因為它遵循原始的 xterm 模型:gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""
該
-e
選項在 Debian 中由一個 shell 腳本部分解決,該腳本試圖提供一組最小的選項(包括一個用於標題的選項)。Debian 對此的政策基於 1990 年代後期的 xterm,並且不止一次成為討論的話題。進一步閱讀:
不同的模擬器對於保持打開特性有不同的能力和協議。有些人根本不會/不能這樣做。其他人則需要腳本來指定模擬器保持打開狀態。我在為一個名為 HDSentinel 的程序編寫一個簡單的腳本時遇到了這個問題。以下是我能想到的各種解決方案:
KDE(控制台模擬器)
konsole -hold -e sudo ./HDSentinel
(
-hold
是需要的參數)啟蒙(術語模擬器)
terminology --hold -e "sudo ./HDSentinel"
(
--hold
是需要的參數)XFCE(XFCE4 模擬器)
xfce4-terminal -H -x "sudo ./HDSentinel"
(
-H
是需要的參數;)編輯:在 xfce 終端中使用 -x 代替 -e
Mate(配對終端仿真器)
mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(使用這個模擬器,你必須首先創建一個自定義配置文件來保持模擬器打開,我叫我的 HoldOpen,但任何名字都可以)
Gnome(gnome 終端模擬器)
gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"
(與 Mate 相同,創建配置文件以保持模擬器打開)
LXDE(lx 終端)
LXDE 自帶的
lxterminal
模擬器不支持保持終端打開所以底線是一些模擬器將支持保持打開,而有些則不會。在那些這樣做的人中,啟用該功能的方式會有所不同。如果您正在查看此處未列出的模擬器,則必須使用 Google 搜尋該模擬器以了解您是否/如何啟用保持打開。
如果您擁有的模擬器根本不支持保持打開,您可能會發現您的發行版確實包含一個支持它的替代模擬器(許多發行版包括 xterm 以及它們的桌面版模擬器)。如果您沒有支持保持打開的模擬器,您可以隨時從軟體儲存庫中獲取。
這些資訊代表了相當多的研究時間,所以我希望這能幫助人們節省一些時間和挫折。順便說一句,xterm 也使用該
-hold
參數,所以我相信這;bash
將有助於保持打開一個為保持打開功能提供參數的模擬器。但是,如果模擬器不支持此功能(如 lxterminal 的情況),它不會創建保持打開功能,或者如果該模擬器使用自定義配置文件啟用保持打開(如 Gnome 的情況),則啟用保持打開。