更改 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'

相关内容