了解.bashrc和.bash_profile

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

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

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

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

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

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

.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 

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

这类似于默认的每用户.profile如果shell是bash(如上所述)来源每用户.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或其他地方覆盖他们的定义做到这一点。)

进一步阅读

  • 为什么没有为非登录shell调用/ etc / profile?
  • 如何创建一个永久的“别名”?
  • 如何创建永久性Bash别名?
  • 我为什么要这样做. .bash_profile . .bash_profile每次我创建一个新的别名?

这里有一些很好的阅读 。 “.bash_profile是针对登录shell执行的,而.bashrc是针对交互式非登录shell执行的”

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