为什么在.profile中设置别名不起作用?

我在我的.profile文件中有这个作为最后一行。
alias gl="cd /home/jrenner/glances/glances"

即使重新启动后,当我输入gl时仍然显示命令未找到。发生了什么?我已经以正确的用户登录了。

你在哪里输入 'gl'?在终端吗?还是在图形界面中? - Thomas Ward
1没有人曾经解答过最初的“为什么?”问题。我可以确认,在我尝试的任何情况下,.profile 中定义的别名都不起作用:文本控制台登录、图形终端或其他任何地方,即使来自同一文件的环境变量是有效的。 - Daniel Mahler
@DanielMahler,你有什么理由吗? - Maged Saeed
5个回答

有两个相关的原因导致别名在将其放入.profile文件时并不总是起作用。首先,.profile(或.bash_profile)文件仅在登录shell中运行。如果您在X下的终端窗口中启动bash,您的终端仿真器(例如gnome-terminal)可能不会将bash作为登录shell运行。[大多数终端仿真器都有一个选项可以更改此设置,但默认情况下(至少对于gnome-terminal来说)不会将其作为登录shell运行。]
Shell将是一个交互式shell,因此将运行.bashrc。
然而,通常在启动X会话时已经以登录shell方式运行了bash。因此,如果在.profile中存在别名命令,则它们将与设置环境变量(如PATH等)一起执行。当打开终端窗口时,会运行一个新的bash实例来提示并在该终端窗口中执行命令。与环境变量不同,别名无法从一个由其启动的新实例传递到另一个实例。因此,别名不会传递给新的shell。
要验证这一点,请尝试进行以下实验:
export ROBERT=bob
alias james=jimmy
echo $ROBERT
alias james
bash               #start a new bash instance
echo $ROBERT
alias james
exit               #end the new bash instance and revert to the original one
echo $ROBERT
alias james

请注意,当bash作为登录shell启动时,不会运行.bashrc文件。因此,除非你的.bashrc文件是从.profile文件中引用的,否则在那里放置别名可能不会起作用。将.bashrc文件源自.profile文件是一种非常常见的做法。

验证:在.bash_profile中添加source .bashrc可以使.bashrc中设置的别名生效。 - Treefish Zhang
看起来这应该是正确的答案。另外,在Ubuntu中,只需将您的别名添加到~/.bash_aliases中。这是正确的做法(有关详细信息,请阅读.bashrc文件)。 - Emilio

我非常确定lpanebr的想法会起作用,但这里有一个更优雅的解决方案。在.bashrc中执行别名命令。这就是我的做法,或者有些人喜欢添加一个专门用于别名的文件。将其命名为.alias或其他,并将.alias添加到你的.bashrc中。

希望我能像@lpanelbr一样进行格式设置。不知道是否有维基页面?


1关于格式化,askubuntu使用的是markdown。请查看http://askubuntu.com/editing-help获取详细信息。 - saji89
1为什么 .bashrc 起作用而 .profile 不起作用?另外,你为什么选择将别名文件命名为 .allias 而不是 .alias - Tom
#1 从我的理解来看,.bashrc 是特定于 bash 的,而 .profile 则是特定于非 bash 命令行的。#2 我不知道你的意思。毕竟我会拼写。 - Jason

在Ubuntu中正确的做法是将您的别名添加到~/.bash_aliases文件中。如果该文件不存在,请创建它。
这个文件(如果存在)会从默认的~/.bashrc文件中调用,并且该别名也会在您的终端模拟器中可用。

如果你正在使用bash(echo $SHELL)作为shell解释器,我认为最好的方式(或者可能是唯一的方式)是定义自己的CD函数。
编辑你的.bashrc文件,在末尾添加以下内容:
# my custom functions:
function gl () {
   cd /home/jrenner/glances/glances/
}

你还可以这样扩展它:
# my custom functions:
function cdw () {
   cd /home/jrenner/glances/glances/$1
   ls
}

直接切换到一个子目录并列出其内容。

2这可能是一个不错的建议,但它并不是一个答案,因为它没有解释为什么在.profile文件中放置alias指令会失败。 - Tom

$ bash #start a new bash instance

这是我的服务器出了问题。简单的source .profile出了一些问题,原因不明。