有条件地将 $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可能已经导出了。

相关内容