当我以 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
需要图形登录,但是:
- 这不一定由 bash shell 完成,因此别名定义甚至可能不会被处理,更重要的是
- 即使别名定义被处理,它们不会传递给子进程。特别是,它们不会传递到通过打开终端窗口创建的 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