了解.bashrc和.bash_profile


26

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

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

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

在服务器上,我想创建一个别名,是否应该将其放入.bashrc

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


1
可能与以下内容重复:askubuntu.com/questions/1528/bashrc-or-bash-profile-我建议您更改您的问题,以仅询问在全球放置别名的位置。

Answers:


39

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

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

要理解原因,必须了解在什么情况下运行这些文件中的每个命令。我对此有以下误解。

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

个人用户别名

特别是如果使用GUI,则大多数交互式外壳可能都是非登录外壳。即使您从未使用过GUI,也可能仍会以某种频率使用非登录 Shell。您将希望您的别名在这些shell中起作用。

特别是如果您曾经在虚拟控制台中通过SSH非图形方式登录,则可能有时会使用登录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

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

  • ...除非.bash_login存在,否则它将取而代之。
  • ...除非.bash_profile存在,否则它将取而代之。

但是,好消息是,默认情况下,在Ubuntu中,in命令将在交互式登录shell中运行,.bashrc因为默认命令.profile检查当前shell是否为bash(如果.bashrc存在),如果是,则检查source .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,因为他们会在非登陆炮弹仍然不确定。与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. 即使处理了别名定义,也不会将其传递给子进程。特别是,它们不会传递到通过打开“终端”窗口创建的外壳上!

.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文件中定义别名。然后将为交互式非登录外壳程序和交互式登录外壳程序定义它们。原因是在获取用户主目录中的任何文件之前

  • 登录外壳程序(仅登录外壳程序和其他行为类似于登录外壳程序)会/etc/profile自动运行命令。
  • 只有非登录外壳程序会/etc/bash.bashrc自动运行命令,
  • Ubuntu的默认设置/etc/profile检查正在运行的shell是否为bash(如果/etc/bash.bashrc存在),如果是,则为source /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检查外壳程序是否可能是交互式的(通过检查提示文本是否为非空),然后检查当前外壳程序是否为bash并检查源外壳程序是否为bash /etc/bash.bashrc,如果不是,则对bash进行一些工作,已在中完成/etc/bash.bashrc

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

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

进一步阅读


5

这是一些不错的阅读材料。“ .bash_profile用于登录shell,而.bashrc用于交互式非登录shell”

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


4
放入别名.bash_profile是不正确的。在Ubuntu .profile(用于登录shell)中.bashrc,它是交互式bash shell。因此,在所有交互式bash shell 中将别名放入.bashrc(或.bash_aliases源自.bashrc)即可定义它们。别名产生了这个问题。看到这个那个我的答案,以及默认的注释,建议在其中或其中放置别名。.bash_profile~/.bashrc.bash_aliases
伊莱亚·卡根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.