我的问题也许是愚蠢的,但我怎样才能使一个alias
以工作中的sh
所有用户?
我知道我可以加一个别名,让我说一句:
alias ls='ls -l'
在/etc/bash.bashrc
工作bash
但是相当于什么sh
?
我试图放入/etc/profile
但不起作用。
which sh
:/ bin / sh
which sh
仍然说sh
虽然它是bash的符号链接。realpath sh
然而,另有说明。
我的问题也许是愚蠢的,但我怎样才能使一个alias
以工作中的sh
所有用户?
我知道我可以加一个别名,让我说一句:
alias ls='ls -l'
在/etc/bash.bashrc
工作bash
但是相当于什么sh
?
我试图放入/etc/profile
但不起作用。
which sh
:/ bin / sh
which sh
仍然说sh
虽然它是bash的符号链接。realpath sh
然而,另有说明。
Answers:
将您的别名放入/etc/profile
exec 后执行命令:
源/ etc / profile
试试这个解决方案并在此反馈。
一般来说,你不能。
维基百科说,对于POSIX shell(sh
)启动/关闭脚本是
未指定(
.profile
以示例为例)
我甚至没有在POSIX.1-2017中找到这个例子。
在实践中/etc/profile
并且~/.profile
来源(至少在Linux中,sh
我使用的实现很少)。在您的问题的上下文中,问题是它们仅由登录shell提供。并非每个shell都是登录shell。并非每个交互式shell都是登录shell。
此外,登录shell的唯一概念似乎不是由POSIX定义的(如果我错了,有人会纠正我)。虽然在实践中许多实现使用它来强制登录shell行为,但是本文档未指定-l
为必需选项sh
。
即使/etc/profile
由当前非登录shell的(((... - )grand-)grand)父进程解析,也无法继承那里定义的别名,因为别名无法导出; 它们不像导出的变量那样在环境中传播。函数而不是别名也无济于事。
我的结论是:一般来说,你不能指望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
,其中ls
和ls -l
相当于将打破其POSIX合规性。
好的,ls
这不是最好的例子,因为无论如何都不应该解析它的输出。另一方面,你永远不知道用户(误)使用任何工具的方式。
还要注意它可能有一个执行的sh
地方ls
是内置。在这种情况下,使用/bin/ls
或/和PATH
不能覆盖普通ls
手段; 别名或功能可以。
如果您想要一个具有其他名称的“全局”别名,例如
alias ll='ls -l'
然后切换到/bin/ll
脚本看起来对我来说非常安全。ls
保持完整,没有任何损失。该脚本可能如下所示:
#!/bin/sh
exec ls -l "$@"
sh
唯一的一个符号链接到您的首选的壳呢?