如何识别终端中正在运行的REPL?

时间:2017-03-24 17:01:20

标签: linux bash shell

我正在尝试根据特定窗口的操作更改终端标题。到目前为止,我有以下内容将根据目录和服务器进行更新。

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。我已经尝试了herehere等其他地方的所有内容,虽然我通常可以在命令行中使用它的一部分,但它不适用于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,就可以更改终端窗口的标题。 如何识别命令何时进入一个命令?

1 个答案:

答案 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"'

或类似的东西。

序列如下:

  1. PROMPT_COMMAND运行。
  2. shell打印其提示符。
  3. 您键入命令以启动REPL
  4. 你在REPL。您看到的提示由REPL打印,而不是shell,此时不涉及。 shell正在等待你退出REPL;它没有打印任何提示,因此它没有运行PROMPT_COMMAND。
  5. 您在REPL中键入命令。无论你运行了多少,它都是shell看到的单个会话的一部分。
  6. 退出REPL。
  7. PROMPT_COMMAND运行。
  8. shell打印其提示符。