Ame*_*ina 16 zsh path environment-variables
据我了解,向PATH
环境变量添加路径的常用方法是连接由:
字符分隔的路径。
例如,如果我想向它添加三个路径/my/path/1
,/my/path/2
并且/my/path/3
,我必须按如下方式进行:
PATH=$PATH:/my/path/1:/my/path/2:/my/path/3
Run Code Online (Sandbox Code Playgroud)
这不容易阅读。
有没有办法使用多行语法定义或添加PATH
变量的路径?也许使用数组?我正在寻找这样的东西:
PATH =
$PATH
/my/path/1
/my/path/2
/my/path/3
Run Code Online (Sandbox Code Playgroud)
如果有特定于 shell 的有趣解决方案,我正在 zsh 中寻找解决方案。
Mat*_*Mat 20
根本不是一个有趣的解决方案,但非常便携:
PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3
Run Code Online (Sandbox Code Playgroud)
Kab*_*bie 13
在 zsh 中,$path
是一个数组:
path=(
$path
~/.local/bin
~/.gem/ruby/2.0.0/bin
)
Run Code Online (Sandbox Code Playgroud)
注意:两者path
都是小写。
jfg*_*956 11
我不知道它是否适用于 zsh,但它适用于 bash:
PATH=$(paste -d ":" -s << EOF
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)
Run Code Online (Sandbox Code Playgroud)
编辑甚至更短:
PATH=`paste -d ":" -s << EOF
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`
Run Code Online (Sandbox Code Playgroud)
并且不产生进程:
new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"
Run Code Online (Sandbox Code Playgroud)
双引号在,和周围很重要$PATH
,以在变量中保留空格并避免 IFS 的 shell 解释。$IFS
${new_path[*]}
$OLD_IFS
使用 sed 进行带有注释和空行管理的Update2:
PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s
$PATH
/my/path/1
# This is a comment.
/my/path/2
/my/path/3
EOF`
Run Code Online (Sandbox Code Playgroud)
注释字符必须是该行的第 1 个字符,空行应完全为空。要在注释之前和空行上管理空格和制表符,请sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'d
改用(要测试的制表符,因为它可能特定于 sed 实现)。
在 zsh 中,如果您在路径末尾添加目录:
path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)
Run Code Online (Sandbox Code Playgroud)
可移植:如何正确添加路径到 PATH?
您可以使用glob 限定符来排除不存在目录或符号链接的条目。这可能是也可能不是可取的,这取决于您是否希望在会话期间稍后可能添加目录(例如,如果它们位于远程文件系统上)。你不能用path+=/my/path
语法来做到这一点,因为右侧是在字符串上下文中,所以不会进行通配;您可以使用它,path+=(/my/path)
因为每个数组元素都在列表上下文中展开。
path+=(/path/to/app/{i386,share}/bin(-/N))
Run Code Online (Sandbox Code Playgroud)