在以root用户身份登录的服务器上,我看到.bashrc
(Ubuntu 10.10)。
在我的Mac上,我有一个 .bash_profile
Ubuntu总是只有.bashrc
文件而不是文件.bash_profile
吗?(我只是很困惑,所以问,我意识到他们是不同的操作系统,但也许有某种关系吗?)
在服务器上,我想创建一个别名,是否应该将其放入.bashrc
?
如果我希望应用此别名以便所有用户都可以使用该别名怎么办?
在以root用户身份登录的服务器上,我看到.bashrc
(Ubuntu 10.10)。
在我的Mac上,我有一个 .bash_profile
Ubuntu总是只有.bashrc
文件而不是文件.bash_profile
吗?(我只是很困惑,所以问,我意识到他们是不同的操作系统,但也许有某种关系吗?)
在服务器上,我想创建一个别名,是否应该将其放入.bashrc
?
如果我希望应用此别名以便所有用户都可以使用该别名怎么办?
Answers:
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
(如果存在)。
阅读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
以图形登录方式获取,但是:
.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
自动运行命令,但/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
在当地同样的原因,用户不应该将它们定义.profile
S:如果你这样做,他们将只为登录shell为他们的孩子弹定义,而不是。
最后,请注意,与默认的每用户不同.bashrc
,默认/etc/bash.bashrc
文件不包含任何有关别名的内容。在文件中为用户提供别名时,他们无法编辑或禁用它们,这在某种程度上是不寻常的。(当然,他们仍然可以做到这一点,通过覆盖在自己的地方自己的定义.bashrc
,.bash_aliases
或其它地方。)
这是一些不错的阅读材料。“ .bash_profile用于登录shell,而.bashrc用于交互式非登录shell”
因此,对于您的别名,请使用.bash_profile