更改 shell 腳本中的目前終端選項卡標題

更改 shell 腳本中的目前終端選項卡標題

我發現這個腳本可以更改我目前的終端選項卡標題:

#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"

如果我直接在終端機中輸入它們(例如TITLE="\e]2;HELLO\a"),效果很好

但在 shell 腳本 (rename.sh) 中 $PS1 為空,且該腳本不起作用。

rename.sh HELLO 輸出"Terminal tab title changed to HELLO" ,但終端標題未更改。腳本 $PS1 內部是空的。

有人可以幫助我理解這一點嗎?

答案1

這個腳本的工作原理是將 shell 的互動式提示設定為一個字串,其中包含用於操作xterm視窗標題的控製程式碼。每次顯示 shell 的提示符號時,都會輸出變更視窗標題的控製程式碼。

但是,當然,在腳本內部,不會顯示任何互動式提示,因此這些命令沒有明顯的效果(儘管如果您從腳本啟動另一個互動式 shell,您可以看到視窗標題發生變化)。而且由於沒有腳本可以更改其父進程的環境,因此一旦腳本終止,變更就會遺失。

無論如何,從您的腳本中,您當然可以直接列印出控製程式碼。

printf '\033]2;Hello\a'

這會更改視窗的標題一次,但如果任何其他程式稍後再次更改它,則您的舊標題將丟失。更改提示的技巧很普遍,因為過去一些流行的程式經常會在您根據自己的喜好更改視窗標題後立即更改它(儘管我認為這不再是一個常見問題)。缺點是,如果有真正的原因需要更改視窗標題,那麼一旦您的 shell 再次顯示提示符,該更改就會被取代。

如果您希望程式碼更改目前 shell 的提示符,則不能將它們放入常規腳本中;但您可以source使用腳本文件,或將命令放入 shell 函數中(通常在 Bash 設定檔中完成,以使其持久化)。

順便說一句,就計算提示的顯示寬度而言,Bash 提示字元應包含額外的控制碼,以告訴 Bash 提示字元的一部分何時實際上為零寬度。例如,如果您鍵入長命令然後需要退格,您會發現換行不穩定; Bash 將嘗試重繪提示符,但在錯誤的位置進行,因為它認為螢幕控制碼影響了提示符的寬度。您需要在它們周圍添加這些\[\]Bash 控製程式碼。

PS1="$ORIG\[$TITLE\]"

(大括號並沒有真正起到任何作用,而且妨礙了可讀性,所以我把它們去掉了。)

答案2

此變數PS1僅在互動式 shell 中使用,要存取它,您需要使用bash -i rename.sh.

最小的例子:

$ echo 'echo $PS1' > test

然後比較

$ bash test
$ bash -i test

若要將腳本直接作為可執行檔執行,請將以下內容新增至初始行

#!/bin/bash -i

注意只有當您直接 chmod 並運行腳本(例如./rename.sh),而不是使用 時,這才有效bash rename.sh,否則您將不得不bash -i rename.sh再次調用。

編輯

若要直接變更終端標題,可以直接回顯控制代碼。嘗試

echo -e '\033]2;SomeTitle\007'

或者,在腳本內,使用變數

title="SomeTitle"
echo -e '\033]2;'$title'\007'

相關內容