如何将终端标题更改为当前 运行 进程?

How to change the terminal title to currently running process?

我知道how to change the Terminal Window title。我想知道的是如何使 bash 而不是 zsh 写出当前的 运行 过程,所以如果我说

$ ls -lF

我会得到这样的标题

/home/me/curerntFolder (ls -lF)

为时已晚,因为命令已经执行,因此它不会使用已执行的命令设置标题。

您可以结合设置 window 标题和设置提示。

这是一个使用 s PROMPT_COMMAND 的例子:

tputps () {
    echo -n '\['
    tput "$@"
    echo -n '\]'
}

prompt_builder () {
    # Window title - operating system command (OSC) ESC + ]
    echo -ne '3]0;'"${USER}@${HOSTNAME}:$(dirs)"'\a' >&2

    # username, green
    tputps setaf 2
    echo -n '\u'

    # directory, orange
    tputps setaf 208
    echo -n ' \w'
    tputps sgr0 0
}

prompt_cmd () {
    PS1="$(prompt_builder) $ "
}

export PROMPT_COMMAND=prompt_cmd

UPDATE:我之前的回答(下方)在标题栏中显示了 previous 命令。

忽略我之前回答中的所有内容并从头开始:

trap 'echo -ne "3]0;${PWD}: (${BASH_COMMAND})[=10=]7"' DEBUG

运行 命令提示符下的以下内容:

$ sleep 10

window标题栏变为/my/current/directory: (sleep 10)sleep 10变为运行。

运行 两者之一:

$ sleep 1; sleep 2; sleep 3
$ { sleep 1; sleep2; sleep 3; }

标题栏会随着每个 sleep 命令的调用而变化。

运行这个:

$ ( sleep 1; sleep 2; sleep 3 )

标题栏不变(trap 不适用于子流程调用)。

最后一个:

$ echo $(sleep 3; echo abc)

标题栏显示(echo $sleep 3; echo abc)).


上一个回答

添加到这个 answer:

store_command() {
  declare -g last_command current_command
  last_command=$current_command
  current_command=$BASH_COMMAND
  return 0
}
trap store_command DEBUG

PROMPT_COMMAND='echo -ne "3]0;${PWD}: (${last_command})[=15=]7"'

补充阅读材料回复:trap / DEBUG:

除了@markp-fuso的回答之外,以下是我如何让它与 Starship 一起工作。

  function set_win_title() {
    local cmd=" ($@)"
    if [[ "$cmd" == " (starship_precmd)" || "$cmd" == " ()" ]]
    then
      cmd=""
    fi
    if [[ $PWD == $HOME ]]
    then
      if [[ $SSH_TTY ]]
      then
        echo -ne "3]0; ️ @ $HOSTNAME ~$cmd\a" < /dev/null
      else
        echo -ne "3]0;  ~$cmd\a" < /dev/null
      fi
    else
      BASEPWD=$(basename "$PWD")
      if [[ $SSH_TTY ]]
      then
        echo -ne "3]0; ️ $BASEPWD @ $HOSTNAME $cmd\a" < /dev/null
      else
        echo -ne "3]0;  $BASEPWD $cmd\a" < /dev/null
      fi
    fi

  }
  starship_precmd_user_func="set_win_title"
  eval "$(starship init bash)"
  trap "$(trap -p DEBUG |  awk -F"'" '{print }');set_win_title ${BASH_COMMAND}" DEBUG

请注意,这与 Custom pre-prompt and pre-execution Commands in Bash instructions in that the trap is set after starship init. Which I have noted in a bug 不同。