了解 .bashrc 和 .bash_profile

了解 .bashrc 和 .bash_profile

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

在我的 Mac 上我有一个.bash_profile

Ubuntu 是否始终只有一个.bashrc文件而没有.bash_profile?(我只是感到困惑,所以问一下,我意识到它们是不同的操作系统,但也许存在某种关系?)

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

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

答案1

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。对源文件中的 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

但是交互式登录贝壳?而不是.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

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

别名应该不是定义在.profile因为它们在非登录 shell 中仍未定义。与 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

具体来说,大多数桌面环境默认.profile需要图形登录,但是:

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

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

.bash_profile在或.bash_login确实有用的情况下,通常.profile会在它们的某个地方找到来源,这解决了这个问题。(那么剩下的唯一问题是,像 一样,在或.profile中定义别名不起作用。).bash_profile.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存在),如果是,则检查来源/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

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

你应该不是定义全局别名的原因与/etc/profile用户不应在其本地.profile别名中定义它们的原因相同:如果这样做,它们将仅为登录 shell 定义,而不会为其子 shell 定义。

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

进一步阅读

答案2

这里有一些不错的阅读.bash_profile 用于登录 shell,而 .bashrc 用于交互式非登录 shell。

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

相关内容