在Linux和据我所知的所有Unix系统中,终端仿真器默认运行交互式非登录外壳。这意味着对于bash,启动的shell将:
当一个交互的shell但不是登录shell启动时,bash读取并执行命令
/etc/bash.bashrc
和~/.bashrc
,如果这些文件存在。使用--norc
选项可以禁止这种情况 。该
--rcfile
文件选项将强制bash读取和文件,而不是执行命令/etc/bash.bashrc
和~/.bashrc
。
对于登录shell:
当bash作为交互式登录shell或带有
--login
选项的非交互式shell被调用时,它首先从文件/etc/profile
(如果该文件存在)中读取并执行命令。读取文件后,它会查找~/.bash_profile
,~/.bash_login
以及~/.profile
以该顺序,并读取并从存在并且可读的第一个执行命令。
--noprofile
启动外壳程序以禁止此行为时,可以使用该选项。
但是,在OSX上,从默认终端(Terminal.app)中启动的默认外壳程序(即bash)实际上是源代码~/.bash_profile
或~.profile
其他内容。换句话说,它的作用类似于登录外壳程序。
主要问题:为什么默认的交互式shell是OSX上的登录shell?为什么OSX选择这样做?这意味着~/.bashrc
在OSX上所有基于shell的东西的说明/教程中提到的更改内容都将失败,反之亦然~/.profile
。尽管如此,尽管可以对苹果提出许多指控,但雇用无能或愚蠢的开发人员并不是其中之一。大概他们对此有充分的理由,那为什么呢?
子问题:Terminal.app是否实际上运行交互式登录外壳,或者它们是否改变了bash的行为?这是特定于Terminal.app还是与终端模拟器无关?