所以我知道pwd
andcd
在 shell 中有一个“逻辑”和“物理”模式(参见这个问题以及从那里链接的问题)。
现在,假设我有这个符号链接:
/home/<username>/foo -> /tmp/bar
要在本地进行操作,只需执行以下操作:
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
现在,当我在 my$HOME
和cd
into中开始时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