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。更正。