以空白符结尾的 alias

网上经常有人问这个问题:为什么我写的 alias 在 sudo 下就不管用了?

alias 'll=ls -l'

sudo ll a-private-dir

sudo: ll: command not found

为什么会这样?因为正常情况下,alias 只有出现在一条简单命令的命令名称的位置(大部分时候是第一个词的位置)才会生效,给命令加上 sudo 前缀,显然命令名称成了 sudo,ll 就不会被展开了。

解决办法很神奇,就是把 sudo 本身也设置成一个 alias:

alias 'sudo=sudo '

sudo ll a-private-dir

-rw-r--r-- 1 root root ...

...

注意右边那个 sudo 后面的空格,那才是关键。原理是什么呢?Bash 文档中有写:

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

如果一个 alias 展开后的值的最后一个字符是空白符(空格,制表符,换行符),那么紧跟在它后面的那个词,如果是 alias 的话也会被展开。再举个例子: 

alias 'echo=echo foo  '

echo echo echo  # 链式展开,三个 echo 全被展开了

foo echo foo echo foo

这个特性主要就是用在那些接受另外一个命令名称作为参数的命令上的,主要就是 sudo,其它的还有 xargs env nohup 等等,你可以一股脑把它们都设置成 alias:

 alias 'sudo=sudo ' 'xargs=xargs ' 'env=env ' 'nohup=nohup '

我很想知道这个特性的来源,是哪个 Shell 先实现的。于是查了一下:sh 没有 alias 功能;csh 最先有了 alias 功能,但它没有这个特性;ksh88 从 csh 抄了 alias 过来的时候就已经有了这个特性了;Bash 87 年才有的,所以很大可能是 Bash 从 ksh 学来的这个特性,也就是说很有可能是 David Korn 发明的这个特性。

posted @   紫云飞  阅读(848)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2012-09-24 [译]ECMAScript:ES.next和ES6以及ES Harmony之间的区别
2012-09-24 [译]JavaScript:运算符
点击右上角即可分享
微信分享提示