根据路径中的最后2个目录更改终端标题

时间:2013-08-14 09:46:25

标签: bash terminal tcsh

我想在每次进入新目录时(使用cd时)更改标题,但仅显示最后2个目录。我在工作时使用tcsh,在家中使用bash。 例如:如果我在文件夹~/work/stuff并且我写道:cd 1.1,我希望我的新标题为stuff/1.1

我每次更改文件夹时都知道如何更改标题:

alias cd 'cd \!*; echo "\033]0;`pwd`\a"'

我知道如何只拿最后两个目录:

pwd | awk -F / -v q="/" '{print $(NF-1)q$NF}'

问题是如何将这两者结合起来,或者如何以不同的方式做到这一点? 它不必通过cd的别名。

2 个答案:

答案 0 :(得分:2)

我所做的是使用以下代码创建名为titleRename.tcsh的脚本文件:

#!/bin/tcsh -f

set fullpath = "`pwd`\a"
set newTitle = `echo $fullpath | awk -F / '{OFS="/"; if(NF > 2){printf $(NF-2);printf "/"; printf $(NF-1); printf "/"; print $NF;}else print $0}'`
echo "\033]0;$newTitle"

它用awk拆分pwd,只获取最后3个目录,然后打印到选项卡名称。 然后我在.alias文件中添加了以下内容:

alias cd    'cd \!*; <dir of script file>/titleRename.tcsh'

现在每当我cd到另一个目录时标题名称都会自动更改:)

答案 1 :(得分:1)

我原本以为你应该能够使用完整的命令,你可以在别名的反引号中使用pwd,即:

alias cd 'cd \!*; echo "\033]0;`pwd | awk -F / -v q="/" '{print $(NF-1)q$NF}'`\a"'

但现在我意识到嵌套引用可能存在问题。无论如何,这在bash中是行不通的;我认为没有办法在别名中访问命令参数。

您应该使用提示更新标题,而不是别名CD。我不知道tcsh,但在bash中,做这种事情的正常方法是使用特殊的伪变量PS1:

# Minimalist prompt
PS1="\$ "
# Additionally set terminal title to cwd
case "$TERM" in
xterm*|rxvt*)
    PROMPT_DIRTRIM=2
    PS1="\033]0;\w\a$PS1"
    ;;
*)
    ;;
esac

这不会像你那样修剪目录名,但不幸的是我无法获得正确的引用以便能够在PROMPT_COMMAND中使用转义序列。