Linux

如何從 bash 腳本重命名終端視窗?

  • February 4, 2021

我正在編寫一個 bash 腳本,我在其中假裝打開一個新的終端視窗(在本例中為 gnome 終端),執行一些命令並更改終端視窗的標題。

為了更改終端視窗的標題,我正在使用此答案中提出的函式set-title。當我手動打開一個新終端並在終端set-title MY_TITLE中鍵入時,該方法非常有效。但在這種情況下,即使我從*.bashrc文件中獲取**.bashrc*文件,它也無法在 bash 腳本中工作。

#!/bin/bash

gnome-terminal -- /bin/bash -c "echo Hello from terminal 1; set-title Terminal 1; exec /bin/bash";

gnome-terminal -- /bin/bash -c "source ~/.bashrc; echo Hello from terminal 2; set-title Terminal 2; exec /bin/bash";

兩個新打開的終端顯示相同的錯誤:

/bin/bash: set-title: command not found

很明顯bash解釋器沒有找到函式set-title,但是我不知道如何在gnome-terminal打開時強制載入*.bashrc文件。*

我將回答我自己的問題,但在解釋我找到的兩個解決方案之前,我將解釋為什麼我試圖做的事情沒有奏效。

為什麼我最初的方法是錯誤的

如果您的*~/.bashrc*文件中有自定義函式,例如在我的情況下用於設置終端視窗標題的函式,則這些函式在從執行命令的 bash 腳本打開的終端視窗中將不可用自動化方式(如我的問題範例中)。

感謝user414777的提示。你是絕對正確的。我的 ~/.bashrc 文件開頭包含以下程式碼:

# If not running interactively, don't do anything
case $- in
   *i*) ;;
     *) return;;
esac

通過列印選項標誌$-,結果是hB(正如預期的那樣,它不是互動式 shell),所以顯然set-title我在*~/.bashrc*末尾的函式永遠不會添加到 shell 中。

解決方案 1(推薦):使用 xfce4-terminal

正如schrodigerscatcuriosity 所建議的那樣,這是解決該問題的最簡單方法。您可能不喜歡安裝另一個終端工具;如果(就像我的情況一樣)您正在使用 Gnome 並且預設使用 gnome-terminal,但好的方面是您xfce4-terminal可以gnome-terminal將額外的分類級別(如果您打開了許多終端視窗)。

它的xfce4-terminal工作方式與 bash 腳本中的 from 有點不同gnome-terminal,但沒有什麼是你無法真正弄清楚的。在任何情況下,您都可以在下面找到解決方案xfce4-terminal

#!/bin/bash

xfce4-terminal --title "Terminal 1" -e "bash -c 'echo Hello from terminal 1; exec /bin/bash'" &

xfce4-terminal --title "Terminal 2" -e "bash -c 'echo Hello from terminal 2; exec /bin/bash'" &

解決方案 2:使用 xdotool

我發現該問題的另一個解決方案是使用xdotool. xdotool是一個命令行工具,可以在 X11 視窗系統中模擬/自動化人機互動。

這個解決方案過度設計了最初的問題,因為它會產生其他問題,例如 bash 腳本和 X windows 系統之間的同步,因此有必要sleep在 bash 腳本中引入命令,以便給 X 視窗管理器處理事件的時間。這個同步問題使得這個解決方案不可靠,因為它不能在 100% 的情況下工作,並且睡眠時間需要適應視窗系統的速度。

儘管我不建議為問題中暴露的問題採用此解決方案,但我決定在答案中引入該解決方案以確保抖動完整性。其他人可能會發現將此方法應用於其他目的很有用:

#!/bin/bash

function set-title(){
   sleep 0.2
   
   # local WINDOW_ID=`xdotool getactivewindow`
   # local P_ID=`xdotool getactivewindow getwindowpid`
   # echo "the window id is: $WINDOW_ID with PID: $P_ID"

   xdotool type "set-title $@"
   xdotool key KP_Enter
   sleep 0.2
}


gnome-terminal -- /bin/bash -c "echo Hello from terminal 1;echo $-; exec /bin/bash";
# xdotool search --onlyvisible --class 'gnome-terminal'
set-title "Terminal 1"


gnome-terminal -- /bin/bash -c "echo Hello from terminal 2; exec /bin/bash";
# xdotool search --onlyvisible --class 'gnome-terminal'
set-title "Terminal 2"

在這種情況下,set-title包含在*~/.bashrc*文件中的函式將起作用,因為在 .bashrc 中執行命令後gnome-terminal,最後一條指令是/bin/bash. 它再次載入 shell,然後使用 將下一個命令轉發到終端xdotool,這會創建人類使用輸入設備(滑鼠、鍵盤等)生成的相同事件。

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