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
陣列的開頭($path
in是與in 類似的zsh
陣列)。$PATH
csh
and(N/)
是一個 glob 限定符,其中N
啟用nullglob
glob 並/
選擇目錄類型的文件,因此它會將這兩個文件添加到前面,前提是$PATH
它們存在並且屬於類型目錄。
pwd
p
是列印目前w
orkingd
目錄(變數的內容)的命令$PWD
,只有使用$(pwd)
, 或如果$PWD
您.zshrc
想$PATH
有條件地將目錄新增至zsh
起始位置才有意義。但即便如此,這也是危險的,例如,如果您zsh
從/tmp
或 別人的目錄開始,有人可能會在那裡植入惡意文件,從而覆蓋標準命令,例如ls
或rm
。
答案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
可能已經匯出了。