别名:.bash_rc、.bash_aliases和/usr/local/bin之间的区别

玩弄终端时,我注意到有很多方法可以创建永久别名。
我是一个Linux新手,根据我所知,执行以下操作:
  1. sudo ln -s /path/to/executable /usr/local/bin/desired_alias
  2. desired_alias = '/path/to/executable'添加到~/.bashrc文件中
  3. 取消注释~/.bashrc中的这些行:

    if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
    fi
    

    并将desired_alias = '/path/to/executable'放入~/.bash_aliases文件中

所有方法都有相同的效果。
第一种和第二种方法之间有什么区别?
1个回答

使用第一种方法时,您并非创建别名,而是创建符号链接。符号链接是指代其他文件的指针文件:

符号链接是充当指向其他文件的指针的文件。[...] 符号链接是一种特殊类型的文件,其内容为字符串,即链接所指向的另一个文件的路径名。换句话说,符号链接是指向另一个名称的指针,而不是底层对象。

了解更多关于符号链接的信息这里这里

只有通过第二种方法才会实际上创建别名。

别名允许在简单命令的第一个单词中使用时,将字符串替换为该单词。Shell维护一个别名列表,可以使用alias和unalias内置命令进行设置和取消设置(参见下面的SHELL BUILTIN COMMANDS)。每个简单命令的第一个单词(如果未加引号)都会被检查是否有别名。如果有别名,则该单词将被替换为别名的文本。
您可以在任何可以输入命令并由shell(在这种情况下是bash)解释的地方定义别名,但是为了使别名在其他shell中可用,它需要在启动时由shell解释的文件中定义(shell启动,而不是计算机启动)。
对于bash来说,这些文件是/etc/bash.bashrc(系统范围)和~/.bashrc。当shell以交互模式启动时(例如使用Terminal时),这些文件会被解释。我不会提到配置文件,因为它们有不同的目的。
所以,你想将你的别名添加到~/.bashrc中,以便在每个交互式shell中都可以使用它们。 .bash_aliases方法实现了与将别名放入~/.bashrc相同的功能,但其额外好处是更容易被程序解析和操作。 . ~/.bash_aliases表示在当前运行的shell上下文中加载(源)~/.bash_aliases

@lilo 你比我快了!+1 - myusuf3
@gc 我要上床睡觉了,你尽管放飞自我吧 :) - Li Lo
@lilo 哈哈哈 :) - myusuf3
谢谢,但是为什么在/usr/local/bin中的符号链接也能正常工作呢? - Strae
1你可能认为它们的工作方式相同,但实际上并非如此。请阅读我在答案中提到的有关符号链接的资料。符号链接和别名具有不同的目的,并且是出于不同的目的而创建的。为了给你一个例子,说明符号链接与别名的工作方式不同,请尝试这样做:定义一个别名,比如:alias px="ps axu"。然后再尝试使用符号链接来完成相同的任务。 - Li Lo
1@Li Lo:我已经理解了synlink和/usr/local/bin之间的区别,但是我的问题(可能与一般问题有点离题)是:/usr/local/bin到底用来做什么? - Strae
@daniel:/usr/local/bin:此处存放与本地站点相关的程序二进制文件(来自“man hier”)。例如,如果您从源代码编译并安装一个程序,则它将被放置在/usr/local/bin目录下。 - Li Lo