Bash

打開 xterm 以外的終端,在其上執行命令,成功完成後不關閉終端

  • March 23, 2018

我的 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 的情況),則啟用保持打開。

引用自:https://unix.stackexchange.com/questions/155955