![如何创建别名并在 sh 中为所有用户使用(而不是在 bash 中)?](https://linux22.com/image/1360327/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%88%AB%E5%90%8D%E5%B9%B6%E5%9C%A8%20sh%20%E4%B8%AD%E4%B8%BA%E6%89%80%E6%9C%89%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AF%E5%9C%A8%20bash%20%E4%B8%AD%EF%BC%89%EF%BC%9F.png)
我的问题可能很愚蠢,但我怎样才能让它alias
适用sh
于所有用户呢?
我知道我可以加一个别名,比如说这个:
alias ls='ls -l'
以便/etc/bash.bashrc
能够工作,bash
但是的等价物是什么sh
?
我尝试将其放入,/etc/profile
但没有用。
答案1
将别名放入/etc/profile
exec 后,执行以下命令:
源 /etc/profile
尝试此解决方案并在此处反馈。
答案2
总结
一般来说你不能。
维基百科对于 POSIX shell ( sh
),启动/关闭脚本是
未指定(
.profile
作为示例)
我甚至没有找到这个例子POSIX.1-2017。
实际上/etc/profile
,它们~/.profile
是源码(至少在 Linux 中,在sh
我接触过的几个实现中是这样的)。就您的问题而言,问题在于它们仅由登录 shell 提供。并非每个 shell 都是登录 shell。并非每个交互式 shell 都是登录 shell。
此外鞋底登录 shell 的概念似乎没有被 POSIX 定义(如果我错了,请纠正我)。这个文件没有指定-l
为的必需选项sh
,尽管实际上许多实现使用它来强制登录 shell 行为。
即使/etc/profile
由当前非登录 shell 的父进程解析,你也无法继承在那里定义的别名,因为别名无法导出;它们不会像导出变量那样在环境中传播。函数而不是别名也帮不了你。
我的结论是:一般来说,你不能指望sh
自动获取任何文件。要使每个sh
源成为定义别名的特定文件,你需要找到(或编写)一个可以执行此操作的实现。
用户可以使用 手动获取文件. /path/to/file
。
但是,有一种方法可以让你ls
像 一样工作ls -l
。你可以用一个包装器脚本来做到这一点,该脚本将/bin/ls
和exec
-s 替换为/bin/real_ls -l "$@"
(其中real_ls
是真正的ls
重命名)。这种方法并不罕见,比较这个答案. 但也有缺点和陷阱。
- 如果真实的
ls
是一个像这样的瑞士军刀二进制文件的符号链接busybox
,那么当使用名称调用时,二进制文件会产生混淆real_ls
。
/another/dir/ls
通过使用而不是 ,可以轻松避免这种情况real_ls
。但即使如此
- 将来的系统更新可能会覆盖您的自定义
/bin/ls
。
现在可以通过将实际保留ls
为/bin/ls
、将自定义ls
放入/another/dir
并将 添加到/another/dir
作为PATH
所有用户的第一个条目来避免这种情况(您通常可以通过 执行此操作/etc/profile
)。但是然后
- 每个使用
ls
和修改后的PATH
变量(而不是/bin/ls
完整路径)的脚本都会找到您的自定义ls
。
这很容易适得其反。如果你有一个别名,脚本(在子 shell 中运行,而不是源代码)就不会继承它。脚本可以为自己定义一个独立的别名,无论如何,ls
脚本内部不依赖于任何“外部”别名;但它可能很容易依赖于可执行文件ls
解析的任何内容。更改每个用户的行为ls
可能会让他们有点不高兴,不过他们希望在交互式 shell 中调整。但更改ls
每个现有脚本的行为是错误的,尤其ls
是因为由 POSIX 定义并且定义明确指出其行为应取决于-l
选项的存在。ls
用自定义的ls
wherels
和ls -l
are 等价替换将破坏其 POSIX 兼容性。
好吧,ls
这不是最好的例子,因为无论如何都不应该解析其输出。另一方面,你永远不知道用户以何种方式(误用)任何工具。
另请注意,有可能有一个执行of sh
wherels
是内置的。在这种情况下,使用/bin/ls
or/and进行混淆PATH
不能覆盖 plain 的ls
含义;别名或函数可以。
如果你想有一个“全局”别名其他名称,例如
alias ll='ls -l'
那么切换到/bin/ll
脚本对我来说看起来非常安全。ls
保持完整,没有任何损坏。脚本可能如下所示:
#!/bin/sh
exec ls -l "$@"