登录时获取的脚本序列

amp*_*ent 48 bash login .profile bashrc

我想将我所有的登录配置集中在我的~/.bash_profile. ~/.bashrc默认情况下有一个那里,但我用一个~/.bash_profile.

但是,当我登录时,在~/.bash_profile获取源之前的某些内容并显示以下内容:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x
Run Code Online (Sandbox Code Playgroud)

我想删除它,以便只~/.bash_profile显示在我的获取中定义的我自己的初始问候语,但我不确定用户登录时获取/执行的脚本的逻辑/顺序。你能启发我吗?

作为奖励,我还想知道系统启动时自动采购/执行的顺序,而不仅仅是当用户通过登录启动会话时,尽管这对我来说现在不太重要。

ter*_*don 61

这有点复杂。首先,细节取决于您正在运行的外壳类型。要抄袭自己

  • 当您打开终端模拟器(gnome-terminal例如)时,您正在执行所谓的交互式非登录shell。

  • 当您从命令行登录计算机或运行诸如 之类的命令时su - username,您正在运行交互式登录shell。

  • 当您以图形方式登录时,您正在运行完全不同的东西。详细信息将取决于您的系统和图形环境,但一般来说,处理您的登录的是图形外壳。虽然许多图形外壳(包括 Ubuntu 默认)会读取/etc/profile,但~/.profile并非所有外壳都能读取。

  • 最后,当您运行 shell 脚本时,它会在非交互式、非登录 shell 中运行

bash 在启动时将读取的文件取决于它运行的 shell 的类型。以下是man bash(强调我的)的 INVOCATION 部分的摘录:

当 bash 作为交互式登录 shell或作为具有 --login 选项的非交互式 shell调用时,它首先从文件/etc/profile读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的命令中读取和执行命令。当 shell 启动时可以使用 --noprofile 选项来禁止这种行为。

当一个交互的shell不是登录shell 启动时,bash读取并执行命令/etc/bash.bashrc〜/ .bashrc中,如果这些文件存在。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 bash 从文件而不是 /etc/bash.bashrc 和 ~/.bashrc 读取和执行命令。

这些是初始化文件。您还/etc/environment可以设置全局环境变量,但它是读取而不是来源(不执行其中的命令,但设置了变量定义)。

现在,你看到的问候又是另一回事了。这在 中设置/etc/motd并通过 显示pam_motd。如中所述man motd

/etc/motd 的内容在成功登录后由 pam_motd(8) 显示,但就在它执行登录 shell 之前。

缩写“motd”代表“今日消息”,这个文件在传统上一直用于这个目的(它需要的磁盘空间比发送给所有用户的邮件少得多)。

在 Debian GNU/Linux 上,还会显示 /run/motd.dynamic 的内容。该文件由 /etc/init.d/motd 在启动时生成。

要删除消息,只需清空/etc/motd文件并确保/etc/init.d/motd如果存在则不会生成任何内容。


无论如何,根据您显示的输出,您似乎正在通过ssh这意味着您正在运行交互式登录 shell 登录,请参阅上文了解这意味着什么。因此,总而言之,您在登录时关心的事情是(按此顺序):

  1. SSH 守护进程通过pam_motdPAM 库的模块,显示/etc/motd. 通过该pam_env模块,它从/etc/environment和设置环境变量~/.pam_environment
  2. 启动登录shell,依次读取以下文件:
    1. /etc/profile
    2. /etc/bash.bashrc(默认的 Ubuntu/etc/profile/etc/bash.bashrc)。
    3. ~/.bash_profile. 可以在此处读取的其他文件 (~/.profile~/.bash_login) 由于~/.bash_profile存在而被忽略。

  • 自我发现这些东西的一个好技巧是放置哨兵变量。我的意思是,我把`export SET_IN_ETC_PROFILE=yes` 放在`/etc/profile` 里,`export SET_IN_HOME_ZSHRC=yes` 放在`~/.zhshrc` 里(我是zsh 用户),等等......然后重启,一个不错的` env|grep SET_IN` 会告诉你所有的故事。要查看桌面应用程序(您从破折号或 WM 启动的那些,而不使用终端)看到哪些变量,请参阅 http://askubuntu.com/a/356973/16395 (7认同)
  • @Rmano 另一种可以保留顺序的替代方法是以与添加到“PATH”相同的方式创建一个“SET_IN”变量。在每个文件中,`export SET_IN="$SET_IN:$BASH_SOURCE"`。这将产生一个变量“SET_IN”,其中包含所有文件的来源顺序。 (4认同)
  • @xiaobai当然不是,重点是`SET_IN`会告诉你哪些文件已经被读取,而不是按照什么顺序被读取。顺序是标准的,这是我在回答中的手册页摘录中显示的。 (3认同)