Mac OS X如何设置$ PATH的值?


12

我对如何设置$ PATH有基本的了解,但是是否有文档完全描述了Mac OS在何处获取所有附加到$ PATH的路径?我知道类似/etc/profile,,/etc/paths和的东西/etc/profile.d,但是还有其他脚本最终会影响$ PATH的值吗?我也并不是非登录之间非常熟悉,并登录shell( ,.bashrc),.bash_profile但我知道的基本区别。

Answers:


9

通常,您的PATH由外壳设置。对于Bash,所有内容均在手册中进行了说明。您也可以打开man bash并跳至INVOCATION零件。

作为交互式登录shell或--login调用

当Bash作为交互式登录shell或使用--login选项作为非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。

作为交互式非登录外壳程序调用

启动不是登录外壳程序的交互式外壳程序时,如果该文件存在,则Bash从〜/ .bashrc读取并执行命令。另外,在OS X中,path_helper可以读取其中的内容/etc/paths.d并将其附加到路径中。

此处的关键是,在OS X上,终端默认情况下会打开登录外壳,而在Linux上,外壳通常作为非登录外壳启动。Josh Staiger 对登录和非登录shell都有很好的解释

因此,实际上只有这两个三个可以设置路径:

  • /etc/profile(调用path_helper
  • /etc/paths/etc/paths.d(从调用path_helper
  • 您的外壳配置文件(.bash_profile

感谢您的简洁而翔实的回答。因此,我想我有点理解,哪些脚本/工件会影响$ PATH。那么这是否意味着/etc/profilebash主要使用脚本?我没有其他Shell的经验,但我认为它们遵循不同的结构?
Psycho Punch

/etc/profile被大多数(所有?不是100%确定)弹使用。这就是为什么将它放在您想要的任何地方(例如PATH)的好选择。Bash读取.bash_文件,而Zsh则读取.zshrc其他文件。这取决于外壳。
slhck 2013年

“另外,在OS X中,还有path_helper,它读取/etc/paths.d的内容并将其附加到您的路径中。” 不,path_helper不是叫交互式非登录shell(也非交互shell)。/etc/profile实际上,它被称为交互式登录外壳。
Maggyero '19

8

/etc/paths/etc/paths.d/*中的路径通常PATHpath_helper添加。path_helper是从开始运行的/etc/profile,因此,在将bash作为交互式登录shell调用时运行,而在将bash作为非登录shell或非交互式shell调用时则不运行。

/etc/paths/usr/local/bin默认情况下包含结尾,默认情况下/etc/paths.d/为空。

Terminal和iTerm 2默认情况下会打开新的外壳程序作为登录外壳程序,而ssh到计算机时打开的外壳程序也是登录外壳程序。但是,其他平台上的许多终端模拟器tmux,以及Emacs中的shell模式都将新的shell作为非登录shell打开。

我已将此行添加到/etc/launchd.conf

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

它更改了PATH根启动进程的值。该值被所有其他进程(包括按用户启动的进程)继承。您可以/etc/launchd.conf通过重新启动或运行launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf并重新启动进程来应用更改。

在OS X上,~/.profile以图形方式登录时不会读取。如果同时~/.bash_profile~/.profile存在,bash将不读~/.profile无论是。

~/.MacOSX/environment.plist 在10.8中停止工作。

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.