网上经常有人问这个问题:为什么我写的 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 发明的这个特性。

以空白符结尾的 alias的更多相关文章

  1. hadoop2.7.1 HA安装部署(转)

    hadoop集群规划 目标:创建2个NameNode,做高可用,一个NameNode挂掉,另一个能够启动:一个运行Yarn,3台DataNode,3台Zookeeper集群,做高可用. 在 hadoo ...

  2. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  3. php高级

    php面试题之一--PHP核心技术(高级部分) 一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path s ...

  4. 20160824_CentOS6.4x64_关闭IPv6

    1.参考网址: http://blog.csdn.net/suplxj/article/details/7773423 2.我的操作: #cat <<EOF>>/etc/mod ...

  5. Linux bash - 常用操作命令

    一.终端基础 本文摘录一些本人在学习Linux(CentOS 6.6) bash命令,并且会不定期保持更新. 在此先介绍一下Linux shell终端的常规命令输入格式,如下图: 上图中root是用户 ...

  6. php面试题之一——PHP核心技术(高级部分)

    一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...

  7. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  8. centos 关闭触摸板,触摸板点击

    yum install xorg-x11-apps xinput –list 由图可以看出俺的本本触摸板ID为14,于是可以通过以下命令开启与关闭它: 禁止touchpad:xinput set-in ...

  9. centos网速特别慢的最佳解决的方法 - 关闭ipv6

    我使用了centOS,可是发现网速实在是卡得差点儿不能上网,连百度都打不开,可是win却飞快. 后来想到偶然记得有一次看过一段话,说到关闭ipv6,測试来一下,果然有效,关闭来ipv6打开网速飞快. ...

随机推荐

  1. Si2155

    http://www.edom.com.tw/cn/index.jsp?m=prodview&id=1702 Description:新型的Si2155 电视调谐器IC扩展了Silicon L ...

  2. stm32定时器实现60秒定时秒表

    #include "led.h" #include "delay.h" #include "key.h" #include "sy ...

  3. insertion sort(插入排序)

    #include<stdio.h> #include<time.h> int insertion_sort() { ; int a[max],i,j; srand((unsig ...

  4. Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

    这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并 ...

  5. GIF

  6. Dubbo消费端错误: ClassNotFoundException: org.apache.zookeeper.proto.WatcherEvent

    出现错误的原因是消费端war没有启动成功, 但是zkClient和Dubbo的对应Thread启动了, web container无法加载对应的类, INFO: Initializing Protoc ...

  7. [网络安全] [视频分享]KaLi Linux基础培训2016 最新的哦【福吧资源网】

    最新的教程同时针对kali linux2016最新版本的多个问题解决办法还有一些实例利用. 下载地址:http://www.fu83.cn/thread-310-1-1.html

  8. jquery-抖动图组轮播动画

    JQ匀速抖动图组轮播动画 一.HTML+CSS <!DOCTYPE html> <html lang="en" xmlns="http://www.w3 ...

  9. java 装饰者模式与继承的区别

    装饰者模式目标 把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活 装饰者模式 ...

  10. Wireshark基本介绍和学习TCP三次握手

    wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...