zsh/bash:在執行前使用邏輯目錄結構規則擴展命令參數中的相對路徑
所以我知道
pwd
並且cd
在 shell 中有一個“邏輯”和“物理”模式(參見這個 SO question和從那裡連結的問題)。現在,假設我有這個符號連結:
/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
可以。
我將為 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