zsh/bash:在执行之前使用逻辑目录结构规则扩展命令参数中的相对路径

zsh/bash:在执行之前使用逻辑目录结构规则扩展命令参数中的相对路径

所以我知道pwdandcd在 shell 中有一个“逻辑”和“物理”模式(参见这个问题以及从那里链接的问题)。

现在,假设我有这个符号链接:

/home/<username>/foo -> /tmp/bar

要在本地进行操作,只需执行以下操作:

mkdir /tmp/bar
ln -s /tmp/bar ~/foo

现在,当我在 my$HOMEcdinto中开始时foo,我可以通过以下方式获取“逻辑”路径(使用默认设置)pwd,并且可以通过以下方式获取“物理”路径-P

$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar

当然,“ ..”总是指“物理”路径的父级(我的理解是它甚至不被shell解释,只是按原样传递给命令,以及一些特殊的内置命令,例如cd专门解释它)获得“逻辑”行为):

$ pwd
/home/<username>/foo
$ realpath ..
/tmp

我想要的是,当我在$HOME/foo(或其任何子目录)中时,我使用的任何相对路径(例如ls -l ../..)相对于“逻辑”路径进行解释/扩展(如果我必须在命令前加上一些前缀就可以了) 。

例如:

$ pwd
/home/<username>/foo
$ vi ../something.txt

我想解决这个问题vi /home/<username>/something.txt

有没有比执行以下操作更简单/更短的事情(或者编写一个 shell 函数,我可以在命令前面加上该函数来遍历所有参数,并且 - 如果它们引用路径 - 在将它们传递给命令之前展开它们)?

$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)

是否有类似“命令行参数的逻辑路径扩展是在 shell 执行命令之前完成的相对文件路径”?我正在使用zsh,但任何bash或的解决方案zsh都可以。

答案1

我会用 Zsh 来回答这个问题,因为这就是我正在使用的。


..要在使用时获得您想要的效果cd,只需将以下内容添加到您的~/.zshrc文件中:

setopt NO_chase_dots NO_chase_links

文档在这里:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS


..对于所有其他情况,您将需要使用:h(“head”) 扩展修饰符,而不是:

$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt

如果您需要达到一个以上级别,您可以在其后面附加一个数字(前提是您用花括号括住表达式)或只需重复以下操作:h

# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo

文档在这里:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers

相关内容