覆盖依赖于发行版的 Bash 别名以使其表现有所不同

覆盖依赖于发行版的 Bash 别名以使其表现有所不同

在 Ubuntu 16.04 中,我添加了以下代码/etc/bash.bashrc

alias ll="ls -la --group-directories-first"

然后我重新启动。

注意:我使用它是/etc/bash.bashrc因为我需要一个文件中的所有别名并且可供所有用户使用。


我的目的是重写“native”ll别名。但它并没有改变;如果我转到任何包含目录和文件的目录,然后执行ll,我会得到一个列表没有目录在文件上方排序。换句话说。

我做错了什么?

答案1

别名ll是在 default 中定义的.bashrc

别名定义是一个命令。 Bash 是一种命令式语言,它一个接一个地执行命令。如果同一别名有多个定义,则每次 shell 执行其中一个定义时都会重新定义该别名。因此最后一个定义获胜。

当bash启动时,它会先读取系统文件,/etc/bash.bashrc然后再读取用户文件~/.bashrc。因此, 中的定义~/.bashrc会覆盖 中相同别名的任何定义/etc/bash.bashrc。你不能(理智地)做任何事情来/etc/bash.bashrc阻止 中的重新定义~/.bashrc

给用户强加方便的别名是没有意义的。这就是为什么ll在 中定义~/.bashrc而不是在 中定义的原因/etc/bash.bashrc。因此,不要将您首选的定义放在系统文件中,而是将其放在用户文件中。

您可以更改默认值.bashrc- 即/etc/skel/.bashrc.创建用户帐户时,此文件会复制到用户的主目录。更改文件/etc/skel对现有帐户没有影响。但即使这也不是一个好主意,因为您所定义的是个人偏好。

答案2

/etc/bash.bashrc适用于所有用户

~/.bashrc仅适用于主文件夹所在的用户。

ll因此,如果您更改中的别名/etc/bash.bashrc并运行ll,您将获得 中定义的别名的输出~/.bashrc,这是因为~/.bashrc它优先于 中的定义/etc/bash.bashrc

简而言之;添加新的中的别名/etc/bash.bashrc,但要重写,请更改~/.bashrc.

编辑:

如果您确实想将所有内容都放在一个文件中,请从所有用户的所有~/.bashrc ~/.bash_profile和/或~/.profile文件中删除所有别名,然后将所有别名添加到此/etc/bash.bashrc文件中,这将创建一个没有任何问题的全局别名配置。

编辑2:

创建或编辑/etc/skel/.bashrc并复制默认.bashrc配置,以便在创建新用户时不会设置默认别名。

感谢@user4556274 的编辑建议。

答案3

我相当确定/etc/bash.bashrc这不是一件事。您正在寻找的文件是$HOME/.bash_profileOR$HOME/.profile或者您可以使用,$HOME/.bashrc但我认为profile这是您想要完成的任务的正确文件。

.bash_profile有关和之间差异的解释,.bashrc请参阅:http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

要来源.profile.bash_profile请将以下内容添加到您的.bash_profile

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

另一个潜在的选择是放入insidell而不是 an ,我相信该函数将优先于任何具有相同名称的别名集。function/etc/bash.bashrcalias

ll () {

  ls -la --group-directories-first

}

相关内容