如何为所有用户预设别名?

我有Ubuntu 14.04.2。我想让所有用户自动拥有一组特定的别名。我在我的个人.bashrc文件中设置了我的别名,但我不想手动将它们复制到其他用户中。理想情况下,它应该自动为新创建的用户设置这些别名。


1"通过“预设”,你是指希望所有用户都使用特定的别名创建,然后可以轻松重新配置吗?还是说你想创建全局别名,以便所有用户始终拥有它们(并且能够重新定义/取消定义它们...但在查看自己的配置文件时看不到它们,这可能会使他们感到困惑)?或者其他什么意思?相关链接:理解.bashrc和.bash_profile(尽管标题很奇怪,我相信该问题和这个问题实际上非常相似)。" - Eliah Kagan
4个回答

您可以在/etc/profile.d/中创建一个脚本,为所有用户创建别名。
  1. /etc/profile.d目录下创建一个名为00-aliases.sh(或其他任何花哨的名称)的文件:

    gksu gedit /etc/profile.d/00-aliases.sh
    
  2. 将你的别名放入这个文件中。例如:

    alias foo='bar --baz'
    alias baz='foo --bar'
    
  3. 保存文件

  4. 重新启动所有打开的终端以应用更改。
  5. 享受吧!

一些注意事项:
  • /etc/profile 是一个在 ~/.profile 之前运行的全局文件。
  • /etc/profile.d/ 是一个包含由 /etc/profile 调用的脚本的文件夹。
  • 当调用 /etc/profile(当您启动/登录一个 shell 时),它会在 /etc/profile.d/ 中搜索以 .sh 结尾的任何文件,并使用以下命令之一运行它们:

    source /etc/profile.d/myfile.sh
    

    . /etc/profile.d/myfile.sh
    
  • 我在文件名前面加上 00-,以使其在其他脚本之前执行。
  • 您也可以在 /etc/profile 中添加您的别名,但这并不推荐。

2工作得很完美!你能给我一个关于/etc/profile.d目的的简要解释吗? - Brian Sizemore
1@BrianSizemore:我在我的回答中更新了一些解释。你还有什么问题吗? - 0x2b3bfa0
1这解释得非常好。这个澄清帮助我开发其他用途。谢谢你的所有帮助! - Brian Sizemore
不客气!英语不是我的母语,如果你发现任何拼写错误或者打字错误,请纠正。 - 0x2b3bfa0
11该答案中的方法不应被使用。在/etc/profile.d/(或/etc/profile)目录下的.sh文件中定义的别名仅适用于登录shell,并且在交互非登录shell中无法工作。与环境变量不同,bash不能将别名导出给子进程,甚至对于子bash shell也是如此。如果仅在登录shell中进行测试,比如通过虚拟控制台或SSH登录获得的原始shell,则此方法可能看起来正常工作,但它会在子shell中失败,同时在GUI终端窗口中启动的shell中也会失败。(点击此处查看具体示例) - Eliah Kagan
@EliahKagan: 你知道还有其他方法吗?如果是的话,请提供另一个答案。我对此不甚了解。 - 0x2b3bfa0
4@Helio 我对理解.bashrc和.bash_profile的回答提供了另外两种方法,具体取决于目标是什么,并附有详细的解释。我不确定这个问题或那个问题是否可以被视为重复。我已经在这个问题上发表评论,以便从提问者那里获得关于他们需求的澄清。这个问题的范围比那个问题更为狭窄,所以我假设在这里发布一个简短答案,涵盖了我在那里的长篇回答中的一些内容应该没问题。(目前,我希望能够得到提问者对我的评论的回复。) - Eliah Kagan
@EliahKagan:你的回答非常好,解释得很清楚(我的回答与此无关)。如果提问者说这是重复问题,你可以将该问题标记为重复。 - 0x2b3bfa0
@EliahKagan FYI,我在这个答案中引用了你上面的评论:所有用户的别名 - WinEunuuchs2Unix

此处所指出的,最好将全局别名添加到/etc/bash.bashrc中。
alias foo='bar --baz'
alias baz='foo --bar'

因为对于某些(非登录)shell来说,可以忽略/etc/profile.d目录中的脚本。我花了几个小时才弄清楚为什么/etc/profile.d没有起作用。

请参考例如https://askubuntu.com/a/606882/Understanding .bashrc and .bash_profile以了解不同shell之间的区别。


别名只在shell内部有效。如果你想要像可执行文件一样广泛访问,可以将一个小的快捷脚本添加到/usr/bin目录中,例如:
#!/bin/sh
ls -l "$@"

"

"$@"将所有参数传递给可执行文件。脚本的名称将成为可执行文件的名称。

来源:https://unix.stackexchange.com/a/52509/15954

"

这个回答似乎与问题无关。被接受的答案正确回答了问题,而这个回答似乎提供了一个变通方法。 - Brian Sizemore
4@BrianSizemore 我曾经有过和你一样的问题,但是偶然发现了这个更适合我情况的解决方案;希望它能帮助其他处于类似境地的人。对于很多人来说,使用别名就足够了。 - jtpereyda
2@BrianSizemore 这个回答澄清了一个常见的误解(我也曾有过),而且非常有用,与问题直接相关。 - a20

/etc/bashrc

  • 系统范围的函数和别名
  • 环境相关的内容应放在/etc/profile中

除非你知道自己在做什么,否则不建议修改这个文件。最好在/etc/profile.d/中创建一个custom.sh脚本来对环境进行自定义更改,这样可以避免将来更新时需要合并的问题。