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