如何将终端标题更改为当前 运行 进程?
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 标题和设置提示。
这是一个使用 bashs 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 不同。
我知道how to change the Terminal Window title。我想知道的是如何使 bash
而不是 zsh
写出当前的 运行 过程,所以如果我说
$ ls -lF
我会得到这样的标题
/home/me/curerntFolder (ls -lF)
您可以结合设置 window 标题和设置提示。
这是一个使用 bashs 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 不同。