Answers:
/etc/profile
仅针对登录外壳调用此命令,因为这是其特定目的。如果您要为非登录shell的交互式shell运行命令,并且正在使用bash
,请将其放在~/.bashrc
或中/etc/bash.bashrc
。
“配置文件”文件的目的是包含应仅针对登录Shell运行的命令。这些文件是:
/etc/profile
,作为登录shell启动时,由所有Bourne兼容shell(包括bash
和dash
)运行。
中的脚本/etc/profile.d
。
这是针对Bourne风格的shell的,但是没有被编码到shell可执行文件本身中。而是命令中的命令/etc/profile
调用它们。例如,在我的Ubuntu 12.04系统上,/etc/profile
包括以下几行:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
.profile
在用户主目录中,当作为登录shell启动时,由Bourne兼容shell运行(除非被覆盖,请参见下文)。
.bash_profile
或.bash_login
在用户的主目录中。除了以外的其他shell都会忽略它们bash
。但是,如果.bash_profile
存在,请bash
运行它而不是 .profile
。如果.bash_profile
不存在但.bash_login
存在,则运行而不是.profile
。
(但是,通常存在.bash_profile
或.bash_login
(如果存在)被编写为*显式调用.profile
。)
特定于外壳的配置文件的好处是它们可以包含仅对该外壳有效的命令或语法。例如,我可以[[
在.bash_profile
/中使用评估运算符,.bash_login
但是如果在中使用它.profile
,然后以dash
shell身份登录,它将失败。
“配置文件”文件应包含在登录开始时仅应运行一次的命令。(这也包括图形登录,因为它们也是从登录外壳开始的。)如果外壳是交互式的,则运行该外壳的用户可能已登录,因此它可能有一个祖先(启动它或启动它的东西,或启动等)作为登录外壳。
您可能只想运行一次命令,因为:
作为第二种情况(可能会产生不良结果)的示例,请考虑以下几行,默认情况下,这些行出现在每个用户的~/.profile
:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
假设您使用SSH进入,运行了另一个shell(例如zsh
),在某个时候发现您想暂时返回到bash
环境,但又要保留环境(因此在时bash
再次运行zsh
),然后运行一个像mc
这样的程序来运行shell界面。如果bin
您的主文件夹中存在用户名james
,则您PATH
的最内层外壳中的内容将类似于:
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
这是低效的,并且(更重要的是)使其难以理解的内容PATH
。
但是,这绝不是灾难。据我所知,如果每个交互式shell都以“配置文件”作为源文件,则在默认配置下不会发生任何可怕的事情。但是,由于“配置文件”文件的目的是包含每次登录仅运行一次的命令,因此用户或管理员可以将命令添加到仅在启动登录Shell时必须运行的配置文件。
如果使用bash
,则每个交互式shell中都有要运行的命令文件:
/etc/bash.bashrc
.bashrc
在用户的主目录中。这最常用于以下命令
例如,通常应该启用命令行制表符补全功能,无论是否bash
是登录外壳程序。因此,它出现在~/.bashrc
:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
此处1和2都适用:这不会继承到在此外壳程序中运行的其他外壳程序,并且bash
即使我使用其他外壳程序登录,制表符补全也应该起作用。
如果您正在使用bash
并且希望命令在登录外壳程序和交互式外壳程序中运行,而不是在登录外壳程序中运行,则通常将其放在/etc/bash.bashrc
或中就足够了~/.bashrc
。这是因为,在默认情况下,/etc/profile
并~/.profile
明确地运行它们。例如,~/.profile
具有:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(类似地,/etc/profile
来源/etc/bash.bashrc
为bash
)。
因此,当您启动交互式bash
外壳程序(无论它是否是登录外壳程序)时,“ profile”和“ rc”文件都会运行。
您可能不想为所有非交互式外壳程序运行指定任何命令。它们将在每次运行脚本时运行(前提是该脚本由您配置为运行它们的外壳程序运行)。
这可能会导致严重损坏。如果要执行此操作,并且系统上除了使用的管理员帐户之外没有其他管理员帐户,则可能要创建一个;这样可以更轻松地纠正错误。
在其中bash
,无论外壳是否交互式,实际上都将运行“ rc”文件。但是,他们在最上方说:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
因此,如果即使在非交互式外壳(如运行脚本的外壳)中也需要命令自动运行,则可以在这些行之前添加命令。
登录启动登录外壳程序。如果您希望之后启动的shell充当登录shell,则以-l
标志(代表l ogin)启动。例如:
除非您想以另一个用户身份启动,否则这是启动登录外壳程序(无需登录)的最佳方法。然后,使用:
sudo -i
用于root
(sudo -s
用于非登录交互式根shell)sudo -u username -i
对于任何用户su - username
非root
用户使用(用于非登录交互式根shell)su username
一个初始登录壳是相同的一个登录shell。这个答案在每个地方都说“ login shell”时,可能会说“ initial login shell”(本节中的内容已经不再有意义了)。
初始登录外壳一词的一个原因是,登录外壳也以不同的方式使用-标识哪个程序用作通过登录执行的外壳。这就是登录shell曾经说过的感觉:
bash
联机帮助页In bash, the "rc" files are actually run whether the shell is interactive or not.
是不正确的。/etc/bash.bashrc由/etc/bash.profile触发。