以下是一个示例:../c/Users/test
我仍然不知道如何实现这个zsh的提示,如果可能的话,它也会在bash
中如何实现?
编辑:nearest
表示我的pwd
将显示为:/home/abc/c/Users/test
。
如果我在/home/abc/c
或/home/abc
或/home
下,则提示应为/home/abc/c>
或/home/abc>
或/home>
因此,只有超出三个文件夹的当前路径才会在前面添加..
和三个nearest
文件夹。
答案 0 :(得分:1)
这似乎可以解决问题:
$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5
例如:
PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):'
工作原理:
jasen@gonzo:/var/spool/news/comp/lang/c/moderated$ PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):'
../lang/c/moderated:cd
/home/jasen:
已展开以生成提示。
我使用命令替代PS1
... $(
将命令输出插入提示符。
命令本身就是一个管道
首先)
显示当前目录
它的输出在扩展(pwd
)正则表达式模式下通过管道传输(|
)到sed
。 sed被赋予命令。
-r
这是一个"sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x"
替换命令
在此命令中,s后面的符号是我使用的分隔符s
短语x
表示零或多个非斜杠的海序(如目录名称),而其他斜杠[^/]*
表示实际斜杠,/
匹配任何东西(但不是没有)。而.+
代表行尾。
所以从美元开始它会匹配像$
第二个X之后的位,它表示/name/name/name
是替换匹配的内容。在这种情况下..\1
后面跟着括号模式匹配的位中包含的位。 ..
答案 1 :(得分:1)
在zsh
中,这可以通过内置功能完全实现。你只需要放置
%(4/|../%3d|%d)
在您的PROMPT
参数中(也称为PS1
)。
例如:
PROMPT='[%m@%n %(4/|../%3d|%d)]%# '
会得到类似
的东西[abc@machine ../c/Users/test]%
当前目录为/home/abc/c/Users/test
。
<强>解释强>
%(x|true-text|false-text)
:x
表示测试,如果评估为 true ,则zsh
将打印出的内容为 true-text 否则会打印 false-text 。 4/
true 。例如/home/abc/c/Users/test
有5个元素../%3d
,其中%3d
将替换为当前路径的最后3个元素。例如../c/Users/test
。%d
,将替换为完整的当前路径。在bash
(从版本4开始),您可以通过设置PROMPT_DIRTRIM=3
并将\w
置于PS1
来获得非常相似的结果。这也只会显示当前路径的最后3个元素,前面有~/.../
或.../
。这取决于当前目录是否在用户的主目录中。
例如:
PS1='[\u@\h \w]\$ '
PROMPT_DIRTRIM=3
会帮你的
[abc@machine ~/.../c/Users/test]$
当前工作目录为/home/abc/c/Users/test
和
[abc@machine .../share/doc/sometool]$
当前工作目录为/usr/local/share/doc/sometool
。
要获得完全匹配,请在PS1
中添加以下内容:
$(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})
例如
PS1='[\u@\h $(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})]\$ '
重要事项:至少生成路径输出的部分需要完全引用,例如被单引号包围。否则,它将在定义时进行评估,而不是在显示提示时进行评估。
<强>解释强>
$(command)
:这称为命令替换。它将运行command
,然后由结果输出替换。PWD
包含当前工作目录。 a=${PWD%/*}
:/*
的最短匹配将从$PWD
的末尾删除,结果值将分配给参数a
。也就是说,最后一个路径元素将从$PWD
中删除。 a=${PWD%/*} a=${a%/*} a=${a%/*}
:这会删除$PWD
中的最后三个路径元素。如果$PWD
包含三个或更少的元素,那么a
将在结尾处为空。如果有三个以上的元素,则a
包含您不希望显示的所有元素,即您要用..
替换的元素。
(注意:虽然a=${PWD%/*/*/*}
也删除了最后三个路径元素,但如果少于三个元素,则它不会按预期工作。在这种情况下,{{1}结束1}}与$PWD
不匹配,不会删除任何内容,/*/*/*
与$a
相同。)
$PWD
:如果${a:+..}
已定义且不为null,则会被a
替换,否则不会替换任何内容。这意味着如果要删除路径元素,则..
将评估为${a:+..}
。..
:如果${PWD/#$a/${a:+..}})
的开头与$PWD
匹配,那么它将被$a
的子结构替换。基本上,如果${a:+..}
包含任何路径元素,则它们将被a
替换,否则不会更改任何内容。 ..
:由于这一切都发生在命令替换中,因此需要echo
才能输出缩短的路径。