在Mac OS上,PATH是什么?


12

什么是PATH在一个Mac OS?我已经用它来安装全局命令行工具,但是我发现的唯一文档是用于执行此操作的教程,没有对幕后发生的事情进行真正的解释。我也没有在Wikipedia上找到相关页面。

那么** 的目的是PATH什么?/etc/paths~/.bash_profile**有什么区别?

例如,在我的paths文件中,我看到以下内容:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

但是在我的中~/.bash_profile,我看到了:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

这仅仅是用户特定的paths文件添加吗?什么是所有的东西中paths,像/usr/bin


2
请不要将多个问题合并在一个帖子中。您的每一个问题都将在这里受到单独欢迎,但并非所有问题都这样。请将此问题简化为一个问题,您可以将1和2组合在一起,但其他两个与PATH无关。3回答 4解释这里和5并没有太大的意义,我害怕。您的奖金问题也不是,二进制文件是什么?脚本不是。
terdon

我已经把问题编辑了下来。另外,我发现这些链接很有帮助。谢谢。
gwg 2014年

Answers:


15

1. PATH的目的是什么?

PATH是一个环境变量,其中包含一个用冒号分隔的目录列表,您的外壳程序将在其中查找您在命令行上命名的可执行文件,而不提供它们的显式路径(如您的jsdoc示例)。因此,如果您PATH

/usr/bin:/bin:/home/bin

然后将在这些目录中搜索您按名称调用的任何可执行文件(按此顺序),并且找到的第一个可执行文件是已执行的可执行文件。

2. / etc / paths和〜/ .bash_profile有什么区别

根据ServerFault上的此问题/etc/paths用于PATH全局设置(即针对所有用户的系统范围),而~/.bash_profile用于设置每个用户的首选项(其中~将是用户的主目录)。什么是写在.bash_profile既可以添加到全局PATH/etc/paths或完全覆盖它。

作为记录,这/etc/paths似乎是MAC OS的特点:至少在GNU / Linux上我还没有遇到过。


我只是将它们编辑下来,但感谢您回答所有问题!
gwg 2014年

@ggundersen我整理了我的答案以适合您编辑的问题。
约瑟夫R.14年

@ggundersen,您可能还想阅读我的答案以及其中有关/etc/pathsOSX 的链接。
terdon

7

PATH的目的是什么?

这是您的Shell查找程序的方式。ls例如,当您键入内容时,它将运行一个名为的程序,该程序ls可以在/bin包括Mac OS X在内的大多数系统中使用。您的外壳程序只能找到该程序,因为/bin它位于中PATH

Shell PATH从左到右依次搜索程序。如果ls您的系统上有两个程序,并且它们的目录都在您的目录中PATH,它将在目录中第一个列出的目录中找到一个PATH

/ etc / paths和〜/ .bash_profile有什么区别

设置的路径/etc/pathsPATH在启动时添加到Mac OS X上所有shell中。

~/.bash_profile仅仅是Bash在启动时运行的几个Shell脚本之一,其中一些是特定于Bash的。因此,如果你改变你的shell - Mac OS X中还附带tcshzsh,例如-改变作出/etc/bashrc不应用到新的外壳。

同样,/etc/paths是系统级配置文件,而~/.bash_profile每个用户都是。如果您在Mac上设置了多个交互式用户,则不想将目录添加到/etc/paths不想出现在每个用户的目录中的目录PATH。对于/etc/bashrc,这同样适用,只是当然仅适用于使用Bash作为其shell的用户。

PATH和$ PATH和$ {PATH}有什么区别?

设置变量时,通常只会看到没有标记的变量。FOO=barFOO环境变量设置为字符串bar。如果键入set,shell将显示所有环境变量,在这种情况下,您还将看到没有任何符号的变量。

$PATH并且${PATH}通常可以互换。它们告诉外壳PATH程序就地扩展当前变量的值。不同之处在于如何使用它们以及在何处使用它们。例如:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

在第二个echo命令中,shell不打印任何内容,因为它要求shell打印一个名为的变量FOOx,该变量不存在。Shell将不存在的变量视为空。由于第三个echo使用花括号语法,因此它使外壳程序可以看到您正在请求该FOO变量,并且该x字符只是您要立即打印的另一个字符。

顺便说一句,还有另一种不用花括号就能获得相同效果的方法:

$ echo "$FOO"x
barx

环境变量用双引号引起来,并且引号将x变量扩展与变量分开,以便外壳程序执行正确的操作。

我在FOO这里使用环境变量只是为了清楚起见。我上面编写的所有内容同样适用于PATH,因为它只是另一个环境变量。示例文本将长很多。

导出路径是什么意思?我们什么时候出口?

以上面的FOO示例为例,如果您要运行其他程序,则不会看到该FOO变量,因为该变量未导出。它仅存在于一个shell实例中:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

当我第bash一次在已经使用过的外壳下运行一个新的外壳时,然后尝试显示的值FOO,我得到了一个空白,因为FOO没有将其导出供子程序查看。然后我退出第二个bash实例,将其导出,bash再次运行,现在第二个实例看到的值FOO

您可以使用export,当你想分项目看在shell设置的值,当你不希望这样的事情发生不使用它。

通常,我不会在shell脚本中导出临时变量,因为我不希望它们更改从该shell脚本运行的程序的行为。

我不会回答您的任何其他问题。您一次只能问一个问题。我只回答了这么多,因为它们之间存在模糊的联系。其他所有内容都属于一个单独的问题。

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.