了解 .bashrc 和 .bash_profile

Bla*_*man 28 bash alias

在我以 root 身份登录的服务器上,我看到.bashrc(Ubuntu 10.10)。

在我的 Mac 上,我有一个 .bash_profile

Ubuntu 总是只有一个.bashrc文件而不是.bash_profile吗?(我只是很困惑,所以问,我意识到他们是不同的o/s,但也许有某种关系?)

在我的服务器上,我想创建一个别名,我应该把它放进去.bashrc吗?

如果我希望应用此别名以便所有用户都可以使用它,该怎么办?

Eli*_*gan 47

Bash 别名应该放在单个主目录中的.bash_aliases.bashrc文件中。如果您必须创建全局 bash 别名,它们可以进入/etc/bash.bashrc,但通常最好简单地将它们添加到.bash_aliases.bashrc文件中,/etc/skel以便新创建的用户继承它们。

几乎总是错在定义别名.profile.bash_profile/etc/profile

要了解原因,必须了解在什么情况下运行这些文件中的每一个中的命令。关于这一点存在误解,我将在下面说明。

即使您想为多个用户定义别名,您也应该熟悉如何为单个用户定义别名,以便您可以决定执行所需操作的最佳方法。

个人用户的别名

特别是如果您使用 GUI,您的大多数交互式 shell 可能是非登录shell。即使您从不使用 GUI,您可能仍会经常使用非登录shell。你会希望你的别名在这些 shell 中工作。

特别是如果您曾经在虚拟控制台通过 SSH以非图形方式登录,您可能有时会使用登录 shell。所以你会希望你的别名也能在交互式登录 shell 中工作。

当一个交互式的、非登录的 shell 启动时,它会.bashrc在用户的主目录中找到源。默认情况下,在 Ubuntu 中,如果存在,每个用户.bashrc自己的源.bash_aliases

  • 文件是导致它的内容在运行当前的贝壳。即使在文件中的所有命令都已运行之后,在源文件中对 shell 环境所做的更改仍然存在。

阅读 Ubuntu 默认设置中的注释.bashrc表明,正式打算将别名放入.bashrc.bash_aliases. .bashrc已经包含一些别名定义(运行grep '^[[:blank:]]*alias' ~/.bashrc以查看它们),并给出关于放置新此类定义的位置的明确建议:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
Run Code Online (Sandbox Code Playgroud)

但是交互式登录外壳呢?而不是.bashrc登录 shell 源.profile

  • ...除非.bash_login存在,否则它会被采购。
  • ...除非.bash_profile存在,否则会被采购。

不过,好消息是,在默认情况下在Ubuntu,在命令.bashrc同时在交互式登录shell运行,因为默认.profile检查当前shell是bash(如果.bashrc存在),如果是这样,来源.bashrc

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi
Run Code Online (Sandbox Code Playgroud)

我建议用户.bash_aliases在他们的主目录中定义新的 bash 别名(如果它不存在则创建它)。这是在每个用户级别使别名定义永久化的一种特别干净和简单的方法。

别名应该中定义.profile,因为他们会在非登陆炮弹仍然不确定。与 bash shell 的大部分环境不同,别名不会导出到子 shell:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found
Run Code Online (Sandbox Code Playgroud)

特别是,默认情况下,大多数桌面环境导致.profile以图形登录为来源,但是:

  1. 这不一定由 bash shell 完成,因此甚至可能不会处理别名定义,更重要的是
  2. 即使处理了别名定义,它们也不会传递给子进程。特别是,它们不会传递给通过打开终端窗口创建的外壳!

.bash_profile.bash_login出于同样的原因,不应在(或) 中定义别名,但也是出于其他原因。天真地创建这些文件之一并在其中放置别名定义可防止任何代码.profile运行!

.bash_profile.bash_login确实有用的情况下,通常.profile在其中某处使用一个来源,这可以解决该问题。(那么唯一剩下的问题是,就像 with 一样.profile,在.bash_profileor.bash_login中定义别名不起作用。)

个人用户的别名,自动

当创建用于代表真人类型的用户帐户时,通常会创建一个新目录作为其主目录。/etc/skel然后将的内容复制到其主目录。这就是多个用户如何在他们的主目录中使用一些类似的配置文件开始的。在Ubuntu中,这包括.profile.bashrc和一些其他文件。

要更改为新用户定义的别名,您只需将它们放入/etc/skel/.bash_aliases(您必须创建它)或/etc/skel/.bashrc.

如果您在 中编辑一个已经存在的文件,/etc/skel您可能希望先备份它——但您不应该将备份放在 中/etc/skel,否则它也会被复制到新用户的主目录中。

这可能是您为多个用户添加新别名的最佳方式。现有用户可以简单地自己添加别名。如果您在 中定义别名/etc/skel/.bash_aliases,您可以简单地将它们定向到该文件,他们可以选择将其复制到其主目录中(或添加到他们自己的自定义.bash_aliases文件中)。

用户取消定义别名是微不足道的。此外,别名不是非常健壮;它们只在特定情况下起作用。如果您需要为每个人创建一个始终有效的新命令,则不应将该命令实现为别名。并且您无法成功地为不想要别名的用户强制使用别名——他们可以简单地使用别名unalias

全局别名,适用于所有用户

尽管我建议您避免这种方法,但您可以全局 /etc/bash.bashrc文件中定义别名。然后将为交互式非登录 shell 和交互式登录 shell 定义它们。原因是,在获取用户主目录中的任何文件之前

  • 登录 shell(并且只有登录 shell 和其他行为类似于登录 shell 的进程)会/etc/profile自动运行命令。
  • 只有非登录 shell 会/etc/bash.bashrc自动运行命令,但是
  • Ubuntu 默认/etc/profile检查正在运行的 shell 是否是 bash(如果/etc/bash.bashrc存在),如果是,则检查 sources /etc/bash.bashrc

这类似于如果 shell 是 bash(如上所述),默认的每个用户如何获取每个用户的.profile.bashrc

以下是默认情况下的实际代码/etc/profile

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi
Run Code Online (Sandbox Code Playgroud)

该块还执行其他任务。具体来说,外部if检查 shell 是否可能是交互式的(通过检查提示文本是否为非空),然后检查当前 shell 是否为 bash,/etc/bash.bashrc如果是,则检查源,如果不是,则为 bash 做一些工作,已经在/etc/bash.bashrc.

你应该定义全局别名/etc/profile在当地同样的原因,用户不应该将它们定义.profileS:如果你这样做,他们将只为登录shell为他们的孩子弹定义,而不是。

最后,请注意,与默认的 per-user 不同.bashrc,默认/etc/bash.bashrc文件不包含有关别名的任何内容。在文件中为用户提供别名而他们无法编辑或禁用它们是有些不寻常的。(当然,他们仍然可以做到这一点,通过覆盖在自己的地方自己的定义.bashrc.bash_aliases或其它地方。)

进一步阅读


gee*_*mc4 5

这里有一些不错的阅读。“.bash_profile 为登录 shell 执行,而 .bashrc 为交互式非登录 shell 执行”

因此,对于您的别名,请使用 .bash_profile

  • 将别名放在 `.bash_profile` 中是不正确的。在 Ubuntu 中,`.profile`(为登录 shell 运行)在它是一个交互式 bash shell 时提供了 `.bashrc`。因此,将别名放在`.bashrc`(或`.bash_aliases`,源自`.bashrc`)中,在*all* 交互式bash shell 中定义它们。`.bash_profile` 中的别名会产生 [这个问题](https://askubuntu.com/q/109985) 等。见[这个](https://askubuntu.com/q/17536)、[那个](https://askubuntu.com/q/1414)、[我的回答](https://askubuntu.com/a/ 606882),以及默认的`~/.bashrc` 的评论建议将别名放在那里或在`.bash_aliases` 中。 (4认同)