如何在bash脚本中获得类似vim选项卡的短路径?
我想创建一个如何在bash脚本中获得类似vim选项卡的短路径?,bash,Bash,我想创建一个bash提示符,其中包含指向当前工作目录的缩短路径,因此 ~/folder/directory/foo 将成为 ~/f/d/foo 我是从这里描述的一个定制的bash提示符()中得到这个想法的,它包含了本应该这样做的代码(根据注释),但是没有。我对bash脚本一无所知,但我打赌这是一个很容易回答的问题 bash脚本中的哪一行或几行代码可以让我生成工作目录的缩短版本?您可以通过sed命令更改$PWD变量(包含当前目录的字符串),如下所示: echo$PWD | sed's://\(
bash
提示符,其中包含指向当前工作目录的缩短路径,因此
~/folder/directory/foo
将成为
~/f/d/foo
我是从这里描述的一个定制的bash
提示符()中得到这个想法的,它包含了本应该这样做的代码(根据注释),但是没有。我对bash
脚本一无所知,但我打赌这是一个很容易回答的问题
bash脚本中的哪一行或几行代码可以让我生成工作目录的缩短版本?您可以通过
sed
命令更改$PWD
变量(包含当前目录的字符串),如下所示:
echo$PWD | sed's://\(.\)[^/]*/://\1/:g'
基本上,这个sed查找两个/
之间的一切(g
)(这就是为什么我使用:
作为分隔符),并将其替换为第一个字符(由\(
和\)
包围的
,后面被引用为\1
),再次被//code>包围
如果将其设置为PS1
变量,则可以根据请求更改bash提示符
希望对您有所帮助。您可以通过sed
命令更改$PWD
变量(包含当前目录的字符串),如下所示:
echo$PWD | sed's://\(.\)[^/]*/://\1/:g'
基本上,这个sed查找两个/
之间的一切(g
)(这就是为什么我使用:
作为分隔符),并将其替换为第一个字符(由\(
和\)
包围的
,后面被引用为\1
),再次被//code>包围
如果将其设置为PS1
变量,则可以根据请求更改bash提示符
希望对您有所帮助。使用sed
是最简单的,因为它支持regex backreference,但为了乐趣和利润,纯bash
解决方案:
path="$(while read -rd/; do echo -n ${REPLY::1}/; done <<< "$PWD"; echo "${PWD##*/}")"
path=“$(while read-rd/;do echo-n${REPLY::1}/;done使用sed
是最简单的,因为它支持正则表达式反向引用,但是为了好玩和赚钱,纯bash
解决方案:
path="$(while read -rd/; do echo -n ${REPLY::1}/; done <<< "$PWD"; echo "${PWD##*/}")"
path=“$(read-rd/;do echo-n${REPLY::1}/;done结合我在问题中引用的链接上的信息,结合Fernando的答案和我自己对regex的一些研究,这是提供我想要的路径的代码:
pwd | sed -e "s:$HOME:~:" -e "s:\(.\)[^/]*/:\1/:g"
第一个sed
模式用~
替换我的主目录/home/joe
,第二个模式用第一个字符替换每个多字符目录名
如果有人感兴趣,我的bashprompt的完整代码如下:。您帮助我的部分在第39行。结合我在问题中引用的链接上的信息,结合Fernando的答案和我自己对regex的一些研究,这是提供我想要的路径的代码:
pwd | sed -e "s:$HOME:~:" -e "s:\(.\)[^/]*/:\1/:g"
第一个sed
模式用~
替换我的主目录/home/joe
,第二个模式用第一个字符替换每个多字符目录名
如果有人感兴趣,我的bashprompt的完整代码在这里:。您帮助我的部分在第39行。这让我有了一部分,但不太管用。如果我的$PWD是/home/joe/Dropbox/foo/bar/folder,我希望是/h/j/D/f/b/folder,但我得到的只是/h/folder。好的,算了。这对sed
co有效mmand:sed“s:\(.\)[^/]*/:\1/:g”
。您的代码使用贪婪的正则表达式,将整个路径作为“两个/
之间的某个对象”.Mine现在匹配任何一组不是斜杠的字符,再加上一个斜杠,所以它不会抓住整个路径。这让我有了一点想法,但不太管用。如果我的$PWD是/home/joe/Dropbox/foo/bar/folder,我希望是/h/j/D/f/b/folder,但我得到的只是/h/folder。好的,我想出来了。这适用于sed
命令:sed“s:\(.\)[^/]*/:\1/:g”
。您的代码使用贪婪的正则表达式,将整个路径作为“两个/
之间的某个对象”.Mine现在匹配任何一组不是斜杠的字符,再加上一个斜杠,这样它就不会抓住整个路径。这就是诀窍。但是,我如何将上面的内容输入到变量中?正如在我引用的链接中一样,我想创建一个名为path
的变量来保存此输出,然后用其他s插入我的bash提示符中tuff。这就是关键。但是,我如何将上面的内容输入变量?正如我引用的链接中一样,我想创建一个名为path
的变量来保存此输出,然后将其他内容插入到bash提示符中。