Bash

zsh/bash:在執行前使用邏輯目錄結構規則擴展命令參數中的相對路徑

  • November 27, 2020

所以我知道pwd並且cd在 shell 中有一個“邏輯”和“物理”模式(參見這個 SO question和從那裡連結的問題)。

現在,假設我有這個符號連結:

/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,但任何解決方案bashzsh可以。

我將為 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

引用自:https://unix.stackexchange.com/questions/620959