OS X 10.6:如何临时更改 ZSH 的 $PATH?

OS X 10.6:如何临时更改 ZSH 的 $PATH?

我想创建一个脚本,将 $PATH 设置为我选择的一组目录(从而忽略预定义路径,例如 /usr/bin、/usr/local/bin 等等),然后启动 ZSH。

这对 BASH 来说很有效:

#!/bin/sh
PATH="/Users/Thoht/Sites/djangostack/apps/django/bin"
# exec /bin/bash --noprofile --norc

我得到了一个新的 BASH 会话,其中的路径只是上面定义的路径,完成后我使用 Ctrl-D 取消。我想为 ZSH 重新创建这个脚本,但没有成功。我试过这个:

#!/bin/sh
PATH="/Users/Thoht/Sites/djangostack/apps/django/bin"
# exec /bin/zsh -f

但是预定义路径(例如 /usr/bin 和所有 jazz)仍然存在,这使得脚本变得毫无用处。

我最好加载我的 .zshrc 并仅仅暂时改变路径。

编辑我忘了添加一件事 - 首先读取的 /etc/zshenv(或者我相信)包含这个脚本:

# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

编辑 2 第一次编辑无关紧要,因为我不想使用 -f 选项。更精确的问题是:

“如何在 shell 脚本中将 .zshrc 路径前面的路径添加到 $PATH,然后正常启动 ZSH(就像读取 .zshrc 一样)?”

答案1

不幸的是,zsh 总是读取全局zshenv文件,不管你如何努力告诉它不要这样做(即即使你调用zsh -f +d)。

您可以复制 zsh 可执行文件,并/etc/zshenv用替换字符串/NO!/zshenv

您不需要告诉 zsh 不要加载用户配置文件,而是可以指定自己的配置文件,并撤消 造成的/etc/zshenv损害$ZDOTDIR/.zshenv

export ZDOTDIR="$(mktemp -d)"
cat <<'EOF' >"$ZDOTDIR/.zshenv"
PATH="/Users/Thoht/Sites/djangostack/apps/django/bin"
EOF
zsh
rm "$ZDOTDIR/.zshenv"
rmdir "$ZDOTDIR"

答案2

哇哦,我解决了。我对 shell 脚本和 ZSH 几乎没有经验,所以这个问题很令人困惑。请允许我重新表述一下:

“我应该如何编写一个脚本,将一堆目录添加到 $PATH 前面,然后运行 ​​ZSH?”

解决方案:

#!/bin/sh
export SOMETHING_PATH="/junk/and/stuff:"
exec /bin/zsh

.zshrc

...
export PATH="$SOMETHING_PATH/bin:/usr/local/bin:/the/rest/of/your/paths"
...

相关内容