.profile
我对 Linux 还很陌生,我将以下命令放在主文件夹下的文件末尾:
export PATH="~/.composer/vendor/bin:$PATH"
我从 Windows 中了解一些环境变量及其值的问题,但在这种情况下,我想了解此命令的作用以及它包含哪些部分:
开头的“导出”是什么意思?它导出的是可供 Bash 使用的数据吗?
什么是第一个
PATH
,什么是第二个$PATH
,为什么我们需要两个?
答案1
开头的“出口”一词是什么?
export
是一个命令(更准确地说,它是一个Bash 内置命令,即它不是 中存在的可执行文件PATH
,而是 Bash 内置的命令)。
它是否正在导出数据以供 Bash 使用?
export
将赋值左侧的环境变量设置为赋值右侧的值;这样的环境变量对于设置它的进程以及在同一环境中生成的所有子进程都是可见的,也就是说,在本例中,对于作为源的 Bash 实例~/.profile
以及在同一环境中生成的所有子进程(可能还包括例如其他 shell,它们反过来将能够访问它)都是可见的。
什么是第一个
PATH
,什么是第二个$PATH
,为什么我们需要两个?
PATH
如上所述,第一个是使用来设置的环境变量export
。
由于在来源PATH
时通常会包含某些内容(默认情况下它包含),因此只需设置为就会仅包含。~/.profile
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PATH
~/.composer/vendor/bin
PATH
~/.composer/vendor/bin
因此在命令执行时,Bash 会将命令中对变量的引用替换为(或“扩展”为)该变量的值,:$PATH
放在要分配的值的末尾,PATH
以便PATH
最终包含~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
(即,在开头PATH
已经包含加上)。~/.composer/vendor/bin:
答案2
https://help.ubuntu.com/community/EnvironmentVariables可能会对你有所帮助。也man bash
可能对理解它的工作原理非常有帮助(至少在 Bash 中)
无论如何 - 至于PATH=
你基本上设置PATH
变量,添加一些新的路径来搜索,在最后添加已经/之前设置的路径$PATH
(基本上是对变量的引用PATH
)。
因此,假设您的PATH
设置目前类似于:
PATH="x:y:z"
然后你设置
PATH="a:b:c:$PATH"
你PATH
之后将会是这样的:
a:b:c:x:y:z
我希望这是有道理的。
最重要的是,您要导出新变量,以便您的环境(包括子进程/子 shell)都知道它。
还要注意,设置的目录顺序PATH
可能很重要。类似下面的命令PATH="$PATH:a:b:c"
将给出结果:
x:y:z:a:b:c
这将影响搜索命令时的目录/路径的顺序(如果您的命令在多个目录中,则将使用第一个找到的命令 - 有时这可能会给您带来一些意想不到的结果)。
答案3
这是命令,以便每个人都可以跟进要点。
export PATH="~/.composer/vendor/bin:$PATH"
export
shell 内置(意味着没有/bin/export
,它是一个 shell 的东西)命令基本上使环境变量可供从中调用的其他程序bash
(参见额外阅读中的链接问题)和子 shell 使用。- shell 中的赋值会先进行扩展,然后再进行赋值。因此双引号内的内容会先进行扩展,然后再保存到
PATH
变量中。 $PATH
是默认PATH
分配(或者至少是直到该命令出现在您的.bashrc
或中时变量的样子.profile
),然后展开它。~/.composer/vendor/bin
将会扩展到/home/username/.composer/vendor/bin
,其中.composer
由于以点开头,所以是隐藏文件夹。- 那个简短的
~/.composer/vendor/bin:$PATH
列表现在已经变成了一长串文件夹,用 分隔:
。所有内容都括在双引号中,以便我们包含路径中带有空格的文件夹。 - 最后,所有内容都存储到
PATH
变量中,并允许外部命令使用它
简单示例
我的交互式 shell 实际上是mksh
,碰巧也有export
内置的。通过使用export
设置VAR
,我的变量可以传递给后续的命令链/子进程并供其使用,在这些命令链/子进程中,我导出了同一个变量
$ echo $SHELL
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR'
$ export VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR'
HelloAskUbuntu
$
额外阅读
答案4
该export
命令使变量在子 shell 中可用。也就是说,如果没有它,变量PATH
在子 shell 中将不可见。
PATH
被提及两次:
- 作为变量,值被分配给
=
符号的左边。 - 变量名被符号右侧的值替换
=
。这使得旧值成为新值的一部分。