Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7094148
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: 系统运维

2015-06-11 23:41:56

在Linux命令行下令人惊叹的惊叹号(!)

[日期:2015-06-11] 来源:Linux中国  作者:Linux [字体:  ]

5. 以关键字为基础执行上个的命令

我们可以以关键字为基础执行上次执行的命令。可以从下面的例子中理解:

  1. $ ls /home >/dev/null[命令1]
  2. $ ls -/home/avi/Desktop>/dev/null[命令2]
  3. $ ls -la /home/avi/Downloads>/dev/null[命令3]
  4. $ ls -lA /usr/bin >/dev/null[命令4]

上面我们使用了同样的命令(ls),但有不同的开关和不同的操作文件夹。而且,我们还将输出传递到/dev/null,我们并未显示输出,因而终端依旧很干净。

现在以关键字为基础执行上个的命令。

  1. ! ls [命令1]
  2. ! ls -[命令2]
  3. ! ls -la [命令3]
  4. ! ls -lA [命令4]

检查输出,您将惊奇发现您仅仅使用关键字ls便执行了您已经执行过的命令。

以关键字为基础执行命令

以关键字为基础执行命令

(LCTT 译注:澄清一下,这种用法会按照命令名来找到最后匹配的命令,不会匹配参数。所以上述执行的四个命令都是执行了 ls -lA /usr/bin > /dev/null,并增加了新的参数而已。)

 

6. !!操作符的威力

您可以使用(!!)运行/修改您上个运行的命令。它将附带一些修改/调整并调用上个命令。让我给您展示一些实际情境。

昨天我运行了一行脚本来获得我的私有IP,因此我执行了:

  1. $ ip addr show | grep inet | grep -'inet6'| grep -'127.0.0.1'| awk'{print $2}'| cut -f1 -d/

接着,我突然发现我需要将上面脚本的输出重定向到一个ip.txt的文件,因此,我该怎么办呢?我该重新输入整个命令并重定向到一个文件么?一个简单的解决方案是使用向上光标键并添加'> ip.txt'来将输出重定向到文件。

  1. $ ip addr show | grep inet | grep -'inet6'| grep -'127.0.0.1'| awk'{print $2}'| cut -f1 -d/> ip.txt

在这里要感谢救世主"向上光标键"。现在,考虑下面的情况,这次我运行了下面这一行脚本。

  1. $ ifconfig | grep "inet addr:"| awk '{print $2}'| grep -'127.0.0.1'| cut -f2 -d:

一旦我运行了这个脚本,Bash提示符便返回了错误消息"bash: ifconfig: command not found"。原因并不难猜,我运行了本应以root权限的运行的命令。

所以,怎么解决呢?以root用户登录并且再次键入整个命令就太麻烦了!而且向上导航键也不管用了(LCTT 译注:当你以新的用户身份登录了,是不能用向上光标键找到之前的另外一个用户的命令历史的)。因此,我们需要调用"!!"(去掉引号),它将为那个用户调用上个命令。

  1. $ su -!! root

这里su是用来切换到root用户的,-c用来以某用户运行特定的命令,最重要的部分是!!,它将被替换为上次运行的命令。当然!您需要提供root密码。

!!操作符的威力

!!操作符的威力

我通常在下面的情景中使用!!。

当我用普通用户来运行apt-get,我通常收到提示说我没有权限来执行。

  1. $ apt-get upgrade && apt-get dist-upgrade

好吧,有错误。但别担心,使用下面的命令来成功的执行...

  1. $ su -!!

同样的适用于:

  1. $ service apache2 start

  1. /etc/init.d/apache2 start

  1. $ systemctl start apache2

普通用户不被授权执行那些任务,这样相当于我运行:

  1. $ su -'service apache2 start'

  1. $ su -'/etc/init.d/apache2 start'

  1. $ su -'systemctl start apache2'

(LCTT 译注:使用!!之前,一定要确认你执行的是什么命令!另外,在 root 身份下,千万不要养成使用它的习惯,因为你总是会在不合适的目录执行不合适的命令!)

 

7.运行一个影响所有除了![FILE_NAME]的文件命令

!(逻辑非)能用来对除了'!'后的文件的所有的文件/扩展名执行命令。

A.从文件夹移除所有文件,2.txt除外。

  1. $ rm !(2.txt)

B.从文件夹移除所有的文件类型,pdf类型除外。

  1. $ rm !(*.pdf)

 

8.检查某个文件夹(比如/home/avi/Tecmint)是否存在?并打印

这里,我们使用'! -d'来验证文件夹是否存在,当文件夹不存在时,将使用其后跟随AND操作符(&&)进行打印,当文件夹存在时,将使用OR操作符(||)进行打印。

逻辑上,当[ ! -d /home/avi/Tecmint ]的输出为0时,它将执行AND逻辑符后面??内容,否则,它将执行OR逻辑符(||)后面的内容。

  1. [!-/home/avi/Tecmint]&& printf '\nno such /home/avi/Tecmint directory exist\n'|| printf '\n/home/avi/Tecmint directory exist\n'

 

9.检查某文件夹是否存在?如果不存在则退出该命令

类似于上面的情况,但这里当期望的文件夹不存在时,该命令会退出。

  1. [!-/home/avi/Tecmint]&&exit

 

10.如果您的home文件夹内不存在一个文件夹(比方说test),则创建它

这是脚本语言中的一个常用的实现,当期望的文件夹不存在时,创建一个。

  1. [!-/home/avi/Tecmint]&& mkdir /home/avi/Tecmint

这便是全部了。如果您知道或偶尔遇到其他值得了解的'!'使用方法,请您在反馈的地方给我们提建议。保持联系!


via: 

作者: 译者: 校对:

本文由  原创翻译, 荣誉推出

本文永久更新链接地址

阅读(468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~