使用多行语法将路径添加到PATH


16

据我了解,将路径添加到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中寻找解决方案。

Answers:


12

我不知道它是否可以在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${new_path[*]}$OLD_IFS保持在IFS的变量,并避免外壳的解释空间。

Update2带有注释和使用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实现)。


我在zsh中测试了最后一个代码片段,它可以工作。我还喜欢它比其他解决方案更干净(每行一条路径)。解决方案可以容纳注释行(路径)吗?空行怎么样?
Amelio Vazquez-Reina

更新注释和空行管理。
jfg956'2

使用sed,如果要播放,可以使用更复杂的脚本来避免粘贴过程。
jfg956

paste解决方案中的路径可以使用缩进吗?
void.pointer 2014年

20

根本不是一个有趣的解决方案,但非常易于移植:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
这是我多年来看到的典型现象。可以轻松地对路径重新排序,甚至可以将元素更改为PATH = / my / path / 1:$ {PATH}以强制执行前置操作。
bsd 2012年

1
您也可以使用它+=来避免完全重建字符串。
克里斯·

而且您甚至不需要使用牙套。冒号不能在环境变量名称中使用,因此没有歧义可以解决。
Alexios

+1表示没意思。有时有趣可能会很好,但这不是那些时候!(特别是因为OP明确提到“不易阅读”是一个问题。)
ruakh 2012年

@ChrisDown是否有无需重新构建字符串即可使用的语法?
约翰·P

12

在zsh中,$path是一个数组:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

注意:两者path均为小写。


那取决于外壳,不是所有人都能处理。
vonbrand 2013年

1
@vonbrand:是的,但是可以在zsh中工作。我认为值得一提。
卡比

3
+1(此问题标记为zsh
Johnsyweb

由于OP特别询问了zsh,因此这是最佳选择
Daniel Serodio

1
对于有兴趣进一步了解$ path与$ PATH区别的人员,请查看此帖子
mbigras 16-10-24

7

在zsh中,如果要在路径末尾添加目录:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

可移植:如何正确添加PATH路径?

您可以使用glob限定词排除不是现有目录的条目或指向该目录的符号链接。根据您是否希望在会话期间稍后添加目录(例如,如果它们位于远程文件系统上),这可能是可取的,也可能是不希望的。您无法使用path+=/my/path语法来做到这一点,因为右侧位于字符串上下文中,因此不会发生乱码;您可以这样做,path+=(/my/path)因为每个数组元素都在列表上下文中展开。

path+=(/path/to/app/{i386,share}/bin(-/N))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.