捕获在我的shell中启动运行进程的命令

捕获在我的shell中启动运行进程的命令,shell,zshrc,Shell,Zshrc,我试图使GNU屏幕中的窗口标题自动等于工作目录的路径加上正在运行的进程(如果有),例如:npm start或vim file.js 为此,我在.zshrc中添加了以下行: precmd () { local action = action_to_define if [[ $TERM == screen* ]]; then printf -Pn '\ek%~ $action\e\\' fi } 这会以某种方式将路径作为标题发送到屏幕 变量操作将打印正在运行的程序(如果存在)

我试图使GNU屏幕中的窗口标题自动等于工作目录的路径加上正在运行的进程(如果有),例如:npm start或vim file.js

为此,我在.zshrc中添加了以下行:

precmd () {
  local action = action_to_define
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~ $action\e\\'
  fi
}
这会以某种方式将路径作为标题发送到屏幕

变量操作将打印正在运行的程序(如果存在)

我尝试了local action=$history | tail-1 | sed's[0-9]*,因为这会像选择历史记录一样选择历史记录中最后一个命令的提示符!!如果选择的话我会做的!!被承认,这不是出于某种原因

和local action=$ps-lr | tail-1 | sed's^.*:…,因为这会选择正在运行的进程的命令

但它不起作用,就好像这个过程既没有被历史记录也没有被历史记录。。。可能是在启动操作之前运行precmd,所以我尝试了其他功能,如preexec或zshaddhistory,但没有任何运气…

precmd挂钩仅在命令完成后运行,就在显示下一个提示之前。因此,当显示提示时,可以使用它更改端子标题。为了在命令运行时更改终端标题,您需要preexec钩子,该钩子在命令运行之前,在按Enter键接受命令后运行

在提示符下确认命令时,该命令将以三种形式作为参数传递给preexec

第一个参数是键入的字符串,包括任何新行,只要历史机制处于活动状态(通常是活动状态) 第二个参数是一行,大小有限。如果命令的扩展别名太长,则会将其截断。 第三个参数是实际使用扩展别名运行的命令的全文 因此,这应该可以做到:

preexec () {
  local action="$1"
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~ $action\e\\'
  fi
}
由于precmd hook仅在提示下一个命令之前运行,因此可以简化:

precmd () {
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~\e\\'
  fi
}
虽然这并不是它不起作用的主要原因,但需要注意的是,在Zsh和大多数其他Unix shell中,在为参数赋值时,=之前或之后不能有空格

具体的行为可能会有所不同,这取决于您将空格放置在何处,以及您使用的是局部赋值、集合赋值还是纯赋值

以问题中的代码为例:

使用local在=之前和之后放置空格通常会导致错误的赋值

仅在=with local之后放置空格将为变量分配一个空字符串,并创建/设置另一个空变量或导致上下文错误,具体取决于预期值是否为可行的参数名称:

 % local action= "echo" 
这会清空动作和回声

这里的操作也是空的,但是本地操作在之后失败,因为由于包含的空间,echo foo不是一个可行的参数名

precmd钩子仅在命令完成后运行,刚好在显示下一个提示之前。因此,当显示提示时,可以使用它更改端子标题。为了在命令运行时更改终端标题,您需要preexec钩子,该钩子在命令运行之前,在按Enter键接受命令后运行

在提示符下确认命令时,该命令将以三种形式作为参数传递给preexec

第一个参数是键入的字符串,包括任何新行,只要历史机制处于活动状态(通常是活动状态) 第二个参数是一行,大小有限。如果命令的扩展别名太长,则会将其截断。 第三个参数是实际使用扩展别名运行的命令的全文 因此,这应该可以做到:

preexec () {
  local action="$1"
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~ $action\e\\'
  fi
}
由于precmd hook仅在提示下一个命令之前运行,因此可以简化:

precmd () {
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~\e\\'
  fi
}
虽然这并不是它不起作用的主要原因,但需要注意的是,在Zsh和大多数其他Unix shell中,在为参数赋值时,=之前或之后不能有空格

具体的行为可能会有所不同,这取决于您将空格放置在何处,以及您使用的是局部赋值、集合赋值还是纯赋值

以问题中的代码为例:

使用local在=之前和之后放置空格通常会导致错误的赋值

仅在=with local之后放置空格将为变量分配一个空字符串,并创建/设置另一个空变量或导致上下文错误,具体取决于预期值是否为可行的参数名称:

 % local action= "echo" 
这会清空动作和回声

这里的操作也是空的,但是本地操作在之后失败,因为由于包含的空间,echo foo不是一个可行的参数名


伟大的preexec有效!很高兴知道周围的空间=很好!preexec有效!很高兴知道周围的空间=