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

Linux 如何识别终端中正在运行的REPL?,linux,bash,shell,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

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

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

我能想到的最好办法就是以某种方式获取最后一个命令,然后找出第一个单词是什么,然后运行if签入
settitle()
。我已经尝试了其他地方的一切,虽然我通常可以让它的一部分在命令行中工作,但没有一部分在
settitle()
中工作。比如说

local:~$ echo 'foobar'
foobar
local:~$ !:0
echo
# I add echo !:0 to settitle()
local:~$ source .bashrc
!:0 
local:~$ 
注意:它应该是以前的“
源代码”
”,或者至少是“
回音”
<代码>!:0无法将自身识别为命令,因此它将反复重复上一个实际命令。被回显的“
!:0
”是一个文本字符串,而不是命令的结果。此外,保存到var不起作用,只需在不尝试回显/保存结果的情况下放置命令,就会得到
!:0:未找到命令


我不想让这成为一个错误,所以如果我在这个过程中的任何一个步骤都弄错了,请让我知道。目标是在输入REPL时能够更改终端窗口的标题如何识别命令何时将我输入其中?

请注意,当您使用不同的REPL时,
提示符命令
和类似的shell功能并不相关;从shell的角度来看,整个REPL会话是一个命令。在退出REPL之前,shell提示符不会再次显示,此时
prompt\u命令和好友被激活

您可以做的一件事是别名用于启动REPL的命令,以便它首先设置窗口的标题:

alias phpa='setttitle PHP; php -a'
alias mysqli=`settitle MySQL; mysql -u "$USER"'
或者类似的

顺序如下:

  • 提示符_命令运行
  • shell打印其提示符
  • 键入命令以启动REPL
  • 你在REPL里。您看到的提示是由REPL打印的,而不是shell,此时不涉及shell。shell正在等待您退出REPL;它没有打印任何提示,因此它从未运行过PROMPT\u命令
  • 您可以在REPL中键入命令。无论运行多少次,它都是单个会话的一部分,shell将其视为单个命令
  • 您退出REPL
  • 提示符_命令运行
  • shell打印其提示符

  • 有时,终端模拟器(通常我不使用很多不同的仿真器)提供了在标题栏中显示当前作业名称的选项,而不需要进一步的shell配置。这意味着省略
    函数
    关键字(定义函数的可移植方法是
    funcname(){
    ,前面没有
    函数
    ),并使用
    而不是
    源代码
    。也就是说,阅读问题时,您似乎没有试图识别shell,而是试图识别父进程。您是否考虑过只查找
    /proc/$PPID/cmdline
    ?@CharlesDuffy-我假设主shell是bash,因为我使用
    。bashrc
    。我将尝试一下你的建议。关于
    /proc/$PPID/cmdline
    ,我一点也不熟悉。当然,除非我严重误读了这个问题,否则你说的是处理一个shell由不同程序启动的情况。如果该程序运行
    sh
    ,那么你有一个不同的shell,而不是bash,无论您的个人默认设置是如何配置的。
    PROMT\u命令是在REPL会话启动之前运行还是在其关闭之后运行?
    PROMT\u命令将在打印提示之前运行。然后您键入一个命令,该命令将运行,并且只有在该命令退出后,PROMPT\u命令才会再次运行。如果您希望在打印时更改窗口标题一个命令正在运行,你不能依靠PROMPT_命令来完成。有没有理由将列表代码格式化而不是作为一个典型的编号列表?需要滚动有点令人不安。没有任何问题,@charlesduff。更正。