sim*_*mon 22
我有一些答案:)你是对的,你使用gnome-terminal并不重要,但是你使用的是什么命令shell并不重要.这样做容易得多zsh,但接下来我会假设你正在使用bash它,而且它是一个相当新的版本(> 3.1).
首先:
哪个环境变量包含当前的'命令'?
有一个环境变量,或多或少你想要的 - $BASH_COMMAND.只有一个小故障,它只会显示管道中的最后一个命令.我不是100%肯定它会用子壳组合做什么,要么:)
所以我希望找到一种方法来捕获bash中的命令并在每个命令后更新标题.
我一直在考虑这个,现在我明白你想做什么,我意识到真正的问题是你需要在每个命令之前更新标题.这意味着$PROMPT_COMMAND和$PS1环境变量作为可能的解决方案,因为它们仅在命令返回后执行.
在bash,我能想到实现你想要的唯一方法是(ab)使用DEBUG SIGNAL.所以这是一个解决方案 - 在你的结尾处坚持下去.bashrc:
trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG
Run Code Online (Sandbox Code Playgroud)
为了解决管道问题,我一直在搞乱这个问题:
function settitle () {
export PREV_COMMAND=${PREV_COMMAND}${@}
printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"
export PREV_COMMAND=${PREV_COMMAND}' | '
}
export PROMPT_COMMAND=${PROMPT_COMMAND}';export PREV_COMMAND=""'
trap 'settitle "$BASH_COMMAND"' DEBUG
Run Code Online (Sandbox Code Playgroud)
但我不保证它是完美的!
Joh*_*lor 13
试试这个:
trap 'echo -ne "\033]2;$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")\007"' DEBUG
Run Code Online (Sandbox Code Playgroud)
感谢history 1它的工作,即使复杂的表达式,如:
true && (false); echo $? | cat
Run Code Online (Sandbox Code Playgroud)
对于哪些方法依赖于$ BASH_COMMAND或$ @失败.例如西蒙的展示:
true | echo $? | cat
Run Code Online (Sandbox Code Playgroud)
感谢Gilles和simon提供的灵感.
我看到stoutie正在尝试做什么,除了它比需要的工作多得多.并且不会导致由于重新定义'cd'而导致的所有其他潜在的坏事,并且只是为了更改目录而进行所有测试.Bash已经为大部分内容提供了支持.
在设置当前的PS1提示后,您可以将它放在.bashrc中(这样它只是预先设置)
# If this is an xterm set the titlebar to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
Run Code Online (Sandbox Code Playgroud)
OP 要求bash,但其他人可能有兴趣了解(如上所述)使用zshshell确实要容易得多。例子:
# Set window title to command just before running it.
preexec() { printf "\x1b]0;%s\x07" "$1"; }
# Set window title to current working directory after returning from a command.
precmd() { printf "\x1b]0;%s\x07" "$PWD" }
Run Code Online (Sandbox Code Playgroud)
在preexec, 中$1包含键入的命令(需要启用 shell 历史记录,这似乎是一个合理的假设)、$2扩展命令(shell 别名等)和$3“非常扩展”命令(shell 函数体)。(更多的)
| 归档时间: |
|
| 查看次数: |
14270 次 |
| 最近记录: |