网上经常有人问这个问题:为什么我写的 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. 设置DIV可编辑

    <div id="move" contentEditable="true">可编辑</div> 设置contentEditable属性可 ...

  2. JS中误用/g导致的正则test()无法正确重复执行

    一个简单的利用正则判断输入是否为数字: input1 = '0281234567';input2 = '0282345678';var reg = /^\d+$/g; reg.test(input1) ...

  3. Excellent Articles

    Lisp The roots of lisp Recursive Functions of Symbolic Expressions and Their Computation by Machine, ...

  4. 理解浮动和position定位

    前言 为了更好理解浮动和position,建议先看看我写的这篇文章<Html文档流和文档对象模型DOM理解> 正文 一.浮动 CSS设计float属性的主要目的,是为了实现文本绕排图片的效 ...

  5. java中两个字符串如何比较大小

    有三种方法实现 第一种直接用字符串类的compareTo方法: 1 2 3   String t1="20131011";   String t2="20131030&q ...

  6. java多线程系类:JUC集合:01之框架

    概要 之前,在"Java 集合系列目录(Category)"中,讲解了Java集合包中的各个类.接下来,将展开对JUC包中的集合进行学习.在学习之前,先温习一下"Java ...

  7. haproxy 新手上路

    apache.nginx之类的反向代理(转发)功能,通常只能用于http协议,其它协议就不好使了(注:nginx据说商业版的,支持tcp协议了). haproxy可以弥补这方面的不足,haproxy支 ...

  8. 简单CSS3实现炫酷读者墙

    如题,给大家介绍和讲解几个常用的CSS3属性,并用到实处. 先看demo(请使用Chrome或者Firefox浏览,IE的靠边): 点此查看实例 觉得爽的可以继续阅读下面的知识点,感觉不爽的可绕行. ...

  9. Codeforces Canda Cup 2016

    A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你 ...

  10. XUtils框架之初步探索

    Xutils分为四大模块. BitmapUtils  DBUtils ViewUtils HttpUtils