在shell提示符下缩写当前目录?


23

vim 有一个非常不错的功能,当它们有点长时可以在其路径中使用:

在此处输入图片说明

它在顶部的选项卡中缩写了文档的路径。有没有办法做类似的事情,所以我的bash提示看起来不是这样的:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
那么,您想要的是rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ 什么?理想情况下,为最大提示长度使用某个阈值?
nicerobot 2011年

确实,这就是我想要的。
Naftuli Kay 2011年

好的,我提供了答案。
nicerobot 2011年

Answers:


14

试试这个

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

或者,纯bash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

然后

PS1='\u@\h ${PS1X} $ '

产生(请注意~${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

感谢@enzotib的帮助,我的答案得到了改善


1
您能否提供一个例子,作为后代的提示?
Naftuli Kay 2011年

(0)您的github链接已损坏。(1)您可能想仔细查看$PWD~测试。当前,如果HOMEis /home/edPWDis /home/edwina,则可以~wina使用Perl版本和~/inaShell版本。(2)如果当前目录包含任何通配符(即,路径名扩展)字符,则您的Shell代码会感到阻塞;例如PWD= /abc/*/def。您可以通过添加set -o noglob或来解决此问题set -f。…(续)
G-Man说'Resstate Monica''16

(续)…(3)您不需要那么多的牙套。在Perl命令中$HOME(在双引号中)并且$PWD足够好。在shell命令,最后三个shell变量的引用都很好,但前三可以"${PWD#$HOME}""$PWD""$p"。(4)另请参阅mbentley的回答和我对此的评论。
G-Man说'恢复莫妮卡'

15

与@nicerobot答案类似,但略短:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

这将显示以下示例输出:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

我喜欢PROMPT_DIRTRIMbash ...

export PROMPT_DIRTRIM=2

会将示例提示更改为...

rfkrocktk@work-laptop ../com/tkassembled/ $

这个对我有用。


不执行他的要求,但感谢您将此功能告知我。
nicerobot 2011年

3
@nicerobot是的,您得到了真正的答案。:)我知道这没有给出他所要求的缩写,但是通常当我们看到简单的选择时,我们的期望就会改变。另外,它是标准的,因此我觉得值得一提。
BentFX

1
我认为SE的功能之一不仅是为问题提供完美的答案,而且还为OP和其他通过搜索找到问题的人提供其他选择。注意我提供的答案上下文“我喜欢...为我工作”。仍然有人认为它应该受到否决。
BentFX

我倾向于看到不能直接回答问题的答案被否决,但是我同意你的看法,提供替代方案可以是一个有效的答案或答案
nicerobot 2011年

BentFX的回答没有整体回答OP的问题,而是主题shell提示符中的当前目录的缩写?对于该主题的大多数访问者来说,这可能正是他们所寻找的。
TNT 2014年

4

以下代码段将添加到enzotib的答案中:

  1. 转换/Path/To/Your/Home/~/(因此路径将~/a/b/c代替/P/T/Y/H/a/b/c
  2. 使用“点文件”的首字母而不是仅显示点(/a/./c/d将变为/a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

确保使用单引号,否则bash会过早扩展它。


3

您使用的格式PS1\W(请参见手册页中的PROMPTING部分bash)。

PS1="\u@\h \W\$ "

并且您可能想阅读那里的其他选项,您可以在命令行中做一些很棒的事情。


2
我认为\ W根本不满足他的要求。
nicerobot 2011年

1
@nicerobot它没有给出路径的每个组件的第一个首字母,但是它确实以较短的方式给出了当前的工作目录。我很确定,如果不使用在每个提示符下执行的一些非常难看的脚本,则无法以这种方式缩写目录。我们将看看他对此有何评论。
凯文

1

我喜欢nicerobot的示例的输出,但是发现了一个问题。我有一个带有连字符的目录A-E,并且它被-E视为printf何时是当前工作目录的一个参数。为了解决这个问题,我在输出--的最后printf添加了引号,以防无输出:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1)很好地解决了包含-第二个字符的目录名称的问题。的确,这--是解决以参数开头的问题的一般方法,但是要说的是-一种更好的方法,因为这也可以防止包含的参数。(例如,尝试= (2)另见nicerobot的回答我的意见。printfprintf "%s" "${q:1}"%PWD/home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def
G-人说'恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.