export PATH = something:$ PATH是什么意思?


27

我是Linux的新手,将以下命令放在.profile主文件夹下文件的末尾:

export PATH="~/.composer/vendor/bin:$PATH"

我从Windows有点了解环境变量及其值的问题,但是在这种情况下,我想了解此命令的作用以及它包括哪些部分:

  1. 开头的“出口”一词是什么?是否正在导出可供Bash使用的数据?

  2. 第一个PATH是什么,第二个是什么$PATH,为什么我们需要两个?


在操作系统之间留出一些技术上的差异,这相当于Windows这个过程:windowsitpro.com/systems-management/...
两位方士

1
“导出”使更改对bash启动的新程序可见。
托尔比约恩Ravn的安徒生

1
@ThorbjørnRavnAndersen:不,无论是否使用export命令,都会发生这种情况,因为该PATH变量已被标记为已导出。(如果您不相信我,请尝试两种方式!)
David

Answers:


39

开头的“出口”一词是什么?

export是一个命令(更确切地说,它是Bash内置的,即它不是可执行文件PATH,它是Bash本身内置的命令)。

是否正在导出可供Bash使用的数据?

export将工作分配左侧的环境变量设置为工作分配右侧的值;这样的环境变量对于设置它的过程以及在同一环境中产生的所有子过程都是可见的,即在这种情况下对于~/.profile在相同环境中产生的所有Bash实例和所有子过程都是可见的(可能还包括其他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:


很棒的解释。
Choylton B. Higginbottom

16

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

这会在搜索命令时影响目录/路径的顺序(如果您将命令放在多个目录中,则将使用第一个找到的命令-有时可能会给您带来一些意想不到的结果)。


2

这是命令,以便每个人在完成要点时都可以遵循。 export PATH="~/.composer/vendor/bin:$PATH"

  • export内置的shell(意味着没有/bin/export,这是一个shell东西)命令基本上使环境变量可用于其他从中调用的程序bash(请参阅Extra Reading中的链接问题)和子shell。
  • Shell中的分配将首先进行扩展,然后分配将进行第二次。因此,双引号内的内容将首先扩展,然后再保存到PATH变量中。
  • $PATH是默认PATH赋值(或者至少是该变量看起来像直到该命令出现在您的.bashrc或中的样子.profile),然后将其展开。
  • ~/.composer/vendor/bin将扩展到/home/username/.composer/vendor/bin,其中.composer由于前导点而隐藏了文件夹。
  • ~/.composer/vendor/bin:$PATH现在,该短文件已转换为一长串文件夹,以分隔:。一切都用双引号引起来,以便我们在路径中包含带空格的文件夹。
  • 最后,所有内容都存储在PATH变量中,并允许使用外部命令

简单的例子

我的交互式外壳实际上是mksh,它也已export内置。通过使用exportset VAR,我的变量可以传递到后续的命令/子过程链中,并由其使用,在该命令/子过程中,我导出了相同的变量

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

额外阅读


3
不,~~/.composer/vendor/bin也不会被展开!代字号仅在几个特殊的地方扩展,例如在=符号后直接扩展。PATH="~/.foo:$PATH"结果~/.foo:/other/path/dirs...。但是~会被扩展PATH=~"/.foo:$PATH",从而导致/home/user/.foo:/other/path/dirs...
Volker Siegel

2

我已经在这里和网络上的其他地方阅读过,与一位朋友交谈过,并决定作为一个新生(也许是更多的Ubuntu新生,然后这里的一些人可能会想到),我应该映射此命令-我应该映射并因此了解它的下落和下落:

初步数据

如果现在您还不了解本章中的内容,请放心阅读,您将需要阅读环境变量(EV),它们的值和用途,这将使您阅读的内容更加清晰。 。现在,我将尝试为像我这样的新手,并且仅针对新手,以简单的单词和映射方法解释该命令。试图在这里尽力而为...

映射

export PATH="~/.composer/vendor/bin:$PATH"

Ubuntu 15.10随附的EV“ PATH”的原始值为:

/usr/bin:/usr/sbin

在命令本身中请注意,我们有两个PATH短语。最后一个是$ PATH-$表示“在您旁边打印EV的原始值”;旁边的EV是路径EV。

我们导出了路径变量本身(也可用于子进程,即在CLI中运行的IE进程,实际上不是Bash shell,而是在其中运行的(例如Drup,它是Drupal CLI))。

除了导出,我们还扩展了它:第一个PATH短语(PATH =)使用我们在原始值(由$ PATH表示)中添加了额外的值(〜/ .composer / vendor / bin :)。

  • 我在上一段中提到的新值末尾的冒号(:)用于将新值与原始值区分开。

  • “”是值所在的区域。

  • 〜是主文件夹。


我希望在完成此映射后,对于像我这样的新生来说,命令会更清晰。


1

export命令使变量在子外壳中可用。也就是说,没有它,该变量PATH将在子外壳中不可见。

PATH 被提到两次:

  • 作为变量,该值被分配给=符号的左侧。
  • 作为变量名被其值右边的=符号代替。这使得旧值成为新值的一部分。

1
“也就是说,没有它,该变量PATH将在子外壳中不可见。” 这是不正确的。PATH是一个环境变量(与shell变量不太一样),因此会自动导出,export因此不需要该命令。
David

Bourne Shell系列并没有真正区分Shell和环境变量。(sc.tamu.edu/help/general/unix/vars.html)在我的系统(Arch Linux)上,bash甚至不知道该setenv命令。
rexkogitans

1
内核知道的环境变量与bash内部的shell变量之间仍然存在差异。由于PATH源自环境,因此会自动导出,因此您无需运行export更改即可传播到子进程(与您链接的页面相反)。
David

环境变量不是内核的属性,而是进程的属性。由于我们在这里讨论的过程是sh,bash(Ubuntu是否使用zsh?),我认为我们可以让它们等于shell变量。但是,当然,shell变量不会像环境变量那样传递给任何随机程序。
rexkogitans

我认为目前我们在语义上陷入困境。我只想说那是bash,PATH=foo并且export PATH=foo行为相同。
David

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. export是bash的buildin命令,表示导出变量为环境变量。(您可以输入help export以进一步倾斜

    (命令后面的字符是参数,按空格分割,因此在这种情况下,只有一个参数)

  2. PATH是变量名,通常,预先设定由varibale的bash,以大写字母命名。

  3. =装置将值分配给该变量。

  4. 所有的字符串都是变量的值

  5. $PATH是bash的一种函数,名为variable expantion,bash将替换PATH参数字符串中存在的值,然后再将字符串发送给exportcommand

  6. :在PATH变量和understooded一个spcial字符由想使用这个变量的所有应用程序。这意味着分隔符。因此它们在PATH变量中将有很多目录。

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.