有條件地將 $pwd 指派給 $PATH 變數

有條件地將 $pwd 指派給 $PATH 變數

bin當目錄存在時,我想將目前工作目錄及其特定於專案的目錄新增至我的 $PATH 中。

所以我將這些行添加到我的.zshrc:

[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"

當我手動將命令貼到終端機時,上面的路徑會被添加到前面,但否則它們不會。和$PATH以前一樣。我還嘗試了不同的方法來編寫它,例如"${PATH}"zshpath函數。它們在手動貼上時都可以工作,但在內部時則不起作用.zshrc文件。

--

我上線了macOS High Sierra v10.13.6預設終端並使用zsh v5.7.1

答案1

具體來說zsh,你可以這樣做:

path[1,0]=( ~/projects/{vendor/,node_modules/.}bin(/N) )

在哪裡:

path[1,0]=( list )

將 the 插入list陣列的開頭($pathin是與in 類似的zsh陣列)。$PATHcsh

and(N/)是一個 glob 限定符,其中N啟用nullglobglob 並/選擇目錄類型的文件,因此它會將這兩個文件添加到前面,前提是$PATH它們存在並且屬於類型目錄

pwdp是列印目前workingd目錄(變數的內容)的命令$PWD,只有使用$(pwd), 或如果$PWD.zshrc$PATH有條件地將目錄新增至zsh起始位置才有意義。但即便如此,這也是危險的,例如,如果您zsh/tmp或 別人的目錄開始,有人可能會在那裡植入惡意文件,從而覆蓋標準命令,例如lsrm

答案2

我認為不可能按照你想要的方式做到這一點,而不是使用 .rc (.rc 僅執行一次,除非你專門這樣做,否則以後不會執行)。但如果有兩個別名呢?

backupPATH=$PATH
function mkpath {
    [ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
    [ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"
}
alias resetpath="PATH=$backupPATH"

這樣您就可以隨時將目前目錄新增至 $PATH 中。

答案3

正如其他人指出的那樣,當您打開新終端時,您的程式碼不一定按預期工作,因為當前工作目錄可能不是包含您的專案的目錄,並且該程式碼是僅有的當新的 shell 啟動時運行。

$HOME相反,您大概知道您的項目在哪裡,可能與您的目錄相關。如果是這樣,您可以使用它:

for binpath in vendor/bin node_modules/.bin; do
    if [ -d "$HOME/projects/$binpath" ]; then
        PATH=$HOME/projects/$binpath:$PATH
    fi
done

export PATH

在這裡,我假設這$HOME/projects就是您的項目所在的位置。

最後的export可能不需要,因為PATH可能已經匯出了。

相關內容