什么是PATH
在一个Mac OS?我已经用它来安装全局命令行工具,但我找到的唯一文档是这样做的教程,没有真正解释幕后发生的事情。我也没有在Wikipedia上找到相关页面。
那么和**的目的是PATH
什么,有什么区别?/etc/paths
~/.bash_profile
例如,在我的paths
文件中,我看到:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Run Code Online (Sandbox Code Playgroud)
但在我的~/.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
Run Code Online (Sandbox Code Playgroud)
这只是对paths
文件的特定于用户的添加吗?里面有什么东西paths
,比如/usr/bin
?
Jos*_* R. 17
1. PATH 的目的是什么?
PATH
是一个环境变量,它包含一个以冒号分隔的目录列表,您的 shell 将在其中查找您在命令行中命名的可执行文件,而不提供它们的显式路径(如您的jsdoc
示例中所示)。因此,如果你PATH
有
/usr/bin:/bin:/home/bin
Run Code Online (Sandbox Code Playgroud)
然后将在这些目录中搜索您按名称调用的任何可执行文件(按该顺序),找到的第一个可执行文件就是执行的那个。
2. /etc/paths 和 ~/.bash_profile 有什么区别
根据ServerFault上的这个问题,/etc/paths
用于设置PATH
全局(即系统范围,为所有用户),而~/.bash_profile
用于设置每个用户的首选项(~
用户的主目录在哪里)。写入的内容.bash_profile
可以添加到全局PATH
from/etc/paths
或完全覆盖它。
根据记录,这/etc/paths
似乎是 MAC OS 的一个特性:至少我没有在 GNU/Linux 上遇到过它。
PATH的目的是什么?
这是您的外壳程序查找程序的方式。ls
例如,当您键入 时,它正在运行一个名为的程序,该程序ls
位于/bin
大多数系统中,包括 Mac OS X。您的 shell 只能找到它,因为/bin
它位于PATH
.
shellPATH
从左到右按顺序搜索程序。如果ls
您的系统上有两个程序,并且它们的目录都PATH
在您的PATH
.
/etc/paths 和 ~/.bash_profile 有什么区别
在 Mac OS X 上的所有 shell 中,在启动时将设置的路径/etc/paths
添加到PATH
。
~/.bash_profile
只是 Bash 在启动时运行的几个 shell 脚本之一,其中一些是 Bash 特定的。因此,如果你改变你的shell - Mac OS X中还附带tcsh
和zsh
,例如-改变作出/etc/bashrc
不应用到新的外壳。
此外,/etc/paths
是系统级配置文件,而~/.bash_profile
每个用户。如果您在 Mac 上设置了多个交互式用户,您不会想要添加/etc/paths
不想出现在每个人的PATH
. 对于 来说也是如此/etc/bashrc
,当然这仅适用于使用 Bash 作为其 shell 的用户。
PATH 与 $PATH 和 ${PATH} 有什么区别?
在设置变量时,您通常只会看到没有符号的变量。FOO=bar
将FOO
环境变量设置为 string bar
。如果您键入set
,shell 会显示所有环境变量,在这种情况下,您还会看到没有任何符号的变量。
$PATH
并且${PATH}
通常可以互换。它们告诉 shellPATH
就地扩展当前变量的值。区别与您使用它们的方式和地点有关。例如:
$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx
$ echo ${FOO}x
barx
Run Code Online (Sandbox Code Playgroud)
在第二个echo
命令中,shell 不打印任何内容,因为它要求 shell 打印一个名为 的变量FOOx
,该变量不存在;shell 将不存在的变量视为空变量。因为第三个echo
使用大括号语法,它允许 shell 看到您正在请求FOO
变量,并且这x
只是您想在之后立即打印的另一个字符。
顺便说一句,还有另一种无需花括号即可获得相同效果的方法:
$ echo "$FOO"x
barx
Run Code Online (Sandbox Code Playgroud)
环境变量用双引号展开,引号将 和x
变量展开分开,因此 shell 会做正确的事情。
我在FOO
这里使用环境变量只是为了清楚起见。我上面写的所有内容也同样适用于PATH
,因为它只是另一个环境变量。示例文本会更长。
出口路径是什么意思?我们什么时候出口?
以上面的FOO
例子为例,如果你要运行另一个程序,它不会看到FOO
变量,因为它没有被导出。它只存在于那个 shell 实例中:
$ echo $FOO
bar
$ bash
$ echo $FOO
$ exit
$ export FOO
$ bash
$ echo $FOO
bar
Run Code Online (Sandbox Code Playgroud)
当我第一次bash
在我已经使用的 shell 下运行一个新的shell,然后尝试显示 的值时FOO
,我得到一个空白,因为FOO
没有导出给子程序查看。然后我退出第二个bash
实例,导出它,bash
再次运行,现在第二个实例看到FOO
.
您可以使用export
,当你想分项目看在shell设置的值,当你不希望这样的事情发生不使用它。
通常,我不会在 shell 脚本中导出临时变量,因为我不希望它们更改从该 shell 脚本运行的程序的行为方式。
我不会回答你的任何其他问题。你一次只能问一个问题。我只回答了这么多,因为它们有模糊的关系。其他一切都属于一个单独的问题。