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
可能已经导出了。