我正在尝试根据特定窗口的操作更改终端标题。到目前为止,我有以下内容将根据目录和服务器进行更新。
function settitle() {
if [[ -z "$ORIG" ]]; then
ORIG=$PS1
fi
TITLE="\[\e]2;$*:$(dirs -0)\a\]" #dirs -0 is like pwd but with ~/ instead of /home/user/
PS1=${ORIG}${TITLE}
}
PROMPT_COMMAND="settitle local" # local is the server name in this case
现在,有时候我在PHP(php -a
)或MySQL(mysql -u user -ppass
)REPL中,我希望标题反映出来而不仅仅是我启动REPL的目录从
我能想到的最好的方法是以某种方式获取最后一个命令,然后找出第一个单词是什么,并在settitle()
中运行if check。我已经尝试了here和here等其他地方的所有内容,虽然我通常可以在命令行中使用它的一部分,但它不适用于settitle()
。例如。
local:~$ echo 'foobar'
foobar
local:~$ !:0
echo
# I add echo !:0 to settitle()
local:~$ source .bashrc
!:0
local:~$
注意:它应该是“source
”,或者至少是“echo
”。 !:0
不会将自己视为一个命令,因此它会一遍又一遍地重复最后一个真正的命令。被回显的“!:0
”是一个文字字符串,而不是命令的结果。此外,保存到var不起作用,只是在不尝试回显/保存结果的情况下放置命令会产生!:0: command not found
。
我不想让它成为XY problem,所以如果我在这个过程的任何一步咆哮错误的树,请告诉我。我的目标是,如果我输入REPL,就可以更改终端窗口的标题。 如何识别命令何时进入一个命令?
答案 0 :(得分:0)
请注意,PROMPT_COMMAND
和类似的shell功能在您使用不同的REPL时无关紧要。从shell的角度来看,整个REPL会话是一个单一的命令。在您退出该REPL之前,shell提示不会再次出现,而且PROMPT_COMMAND
和朋友被激活的时间点。
您可以做的一件事是别名用于启动REPL的命令,以便它首先设置窗口的标题:
alias phpa='setttitle PHP; php -a'
alias mysqli=`settitle MySQL; mysql -u "$USER"'
或类似的东西。
序列如下: