我想知道在哪里必须在PATH
环境变量中添加一个新的路径。我知道这可以通过编辑.bashrc
来完成(例如),但不清楚如何做到这一点。
这样一来
export PATH=~/opt/bin:$PATH
还是这个?
export PATH=$PATH:~/opt/bin
PATH=$PATH:~/opt/bin
或
PATH=~/opt/bin:$PATH
这取决于你是想把~/opt/bin
加在最后(在所有其他目录之后搜索,以防在多个目录中有同名的程序)还是加在开头(在所有其他目录之前搜索)。
你可以同时添加多个条目。PATH=$PATH:~/opt/bin:~/opt/node/bin
或不同的排序方式都可以。不要把export
放在行首,因为它有额外的麻烦(见下文 "关于bash以外的shell的注意事项")。
如果你的PATH
被许多不同的组件建立,你可能会出现重复的条目。参见https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command 和 https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command,以避免添加重复项或删除它们。
一些发行版会自动把~/bin
放在你的PATH中,如果它存在的话,顺便一提。
把修改PATH
的一行放在~/.profile
中,或者放在~/.bash_profile
中,如果你有这样的文件。
注意,~/.bash_rc
不会被任何程序读取,~/.bashrc
是bash的交互式实例的配置文件。你不应该在~/.bashrc
中定义环境变量。定义环境变量如PATH
的正确位置是~/.profile
(或者~/.bash_profile
,如果你不关心bash以外的shell)。参见它们之间有什么区别,我应该使用哪一个?
不要把它放在/etc/environment
或~/.pam_environment
中:这些不是shell文件,你不能在其中使用$PATH
之类的替换。在这些文件中,你只能覆盖一个变量,而不能添加到它。
如果变量已经在环境中,你就不需要export
:变量值的任何变化都会反映在环境中。¹ PATH
几乎总是在环境中;所有unix系统很早就设置了它(事实上,通常在第一个进程中)。
在登录时,你可以依靠PATH
已经在环境中,并且已经包含一些系统目录。如果你正在编写一个可能会在早期执行的脚本,同时设置某种虚拟环境,你可能需要确保PATH
是非空的并且是导出的:如果PATH
仍未设置,那么类似PATH=$PATH:/some/directory
的东西会将PATH
设置为:/some/directory
,开头的空组件意味着当前目录(如.:/some/directory
)。
if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi
在bash、ksh和zsh中,export
是特殊的语法,PATH=~/opt/bin:$PATH
和export PATH=~/opt/bin:$PATH
都是做正确的事情。在其他Bourne/POSIX风格的shell中,如dash(在许多系统中是/bin/sh
),export
被解析为普通命令,这意味着两个不同。
~
只在单词的开头被解析,除了在赋值中(详见https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704)。$PATH
在双引号外[如果PATH
包含空格或[*?
](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters),则会中断。因此在像dash这样的shell中,将export PATH=~/opt/bin:$PATH
PATH
设置为字面字符串~/opt/bin/:
,后面是PATH
的值,直到第一个空格。
PATH=~/opt/bin:$PATH
(裸赋值)不需要引号,做的是正确的事情。如果你想在可移植脚本中使用export
,你需要写export PATH="$HOME/opt/bin:$PATH"
,或者PATH=~/opt/bin:$PATH; export PATH
(或者PATH=$HOME/opt/bin:$PATH; export PATH
以便移植到甚至不接受export var=value
且不做tilde扩展的Bourne shell)。
¹ 这在Bourne shells(实际的Bourne shells,而不是现代的POSIX风格的shells)中并不正确,但你现在极不可能遇到这样的老shells。
我对问题2感到困惑(因为是由于一个不相关的问题,所以从问题中删除)。
有什么可行的方法可以将更多的路径附加在不同的行上? 最初我认为这可以做到这一点。
export PATH=$PATH:~/opt/bin 出口PATH=$PATH:~/opt/node/bin
但它没有,因为第二个赋值不仅附加了
~/opt/node/bin
,还包括之前分配的整个PATH
。这是一个可能的解决方法。
出口PATH=$PATH:~/opt/bin:~/opt/node/bin
但为了可读性,我更希望对一个路径进行一次分配。
如果你说
PATH=~/opt/bin
这就是你的PATH中的***全部内容。 PATH只是一个环境变量,如果你想添加到PATH中,你必须准确地用你想要的内容重建这个变量。 也就是说,你对问题2所举的例子正是你想做的事,除非我完全没有理解问题的重点。
我在我的代码中使用两种形式。 我有一个通用的配置文件,安装在我工作的每台机器上,看起来像这样,以适应可能遗漏的目录。
export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
if [ -d $bindir ]; then
PATH=$PATH:${bindir}
fi
done