关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » HTML5 »在Linux命令行下令人惊叹的惊叹号(!)

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

    2015-06-11 00:00:00 出处:linux.cn
    分享

    ‘!’符号在Linux中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令。下面的所有命令都已经在Bash Shell中经过确切地检验。尽管我没有试过,但大多都不能在别的Shell中运行。这里我们介绍下Linux命令行中符号’!'那惊人和奇妙的用法。

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

    1. 使用数字从历史命令列表中找一条命令来执行

    您也许没有意识到您可以从历史命令列表(之前已经执行的命令集)中找出一条来运行。首先,通过”history”命令查找之前命令的序号。

    $ history

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

    使用history命令找到最后执行的命令

    现在,只需要使用历史命令输出中显示在该命令前面的数字便可以运行这个命令。例如,运行一个在history输出中编号是1551的命令。

    $ !1551

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

    使用命令ID来执行最后运行的命令

    这样,编号为1551的命令(上面的例子是top命令)便运行了。这种通过ID号来执行之前的命令的方式很有用,尤其是在这些命令都很长的情况下。您只需要使用![history命令输出的序号]便可以调用它。

    2. 运行之前的倒数第二个、第七个命令等

    您可以以另一种方式来运行之前执行的命令,通过使用-1代表最后的命令,-2代表倒数第二个命令,-7代表倒数第七个命令等。

    首先使用history命令来获得执行过的命令的列表。history命令的执行很有必要,因为您可以通过它来确保没有rm command > file或其他会导致危险的命令。接下来执行倒数第六个、第八个、第十个命令。

    $ history
    $ !-6
    $ !-8
    $ !-10

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

    通过负数序号运行之前执行的命令

    3. 传递最后执行的命令的参数,以方便的运行新的命令

    我需要显示/home/$USER/Binary/firefox文件夹的内容,因此我执行:

    $ ls /home/$USER/Binary/firefox

    接下来,我意识到我应该执行’ls -l’来查看哪个文件是可执行文件。因此我应该重新输入整个命令么?不,我不需要。我仅需要在新的命令中带上最后的参数,类似:

    $ ls -l !$

    这里!$将把最后执行的命令的参数传递到这个新的命令中。

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

    将上一个命令的参数传递给新命令

    4. 如何使用!来处理两个或更多的参数

    比如说我在桌面创建了一个文本文件file1.txt。

    $ touch /home/avi/Desktop/1.txt

    然后在cp命令中使用绝对路径将它拷贝到/home/avi/Downloads。

    $ cp /home/avi/Desktop/1.txt /home/avi/downloads

    这里,我们给cp命令传递了两个参数。第一个是/home/avi/Desktop/1.txt,第二个是/home/avi/Downloads。让我们分别处理他们,使用echo [参数]来打印两个不同的参数。

    $ echo "1st Argument is : !^"
    $ echo "2nd Argument is : !cp:2"

    注意第一个参数可以使用”!^”进行打印,其余的命令可以通过”![命令名]:[参数编号]“打印。

    在上面的例子中,第一个命令是cp,第二个参数也需要被打印。因此是”!cp:2″,假如任何命令比如xyz运行时有5个参数,而您需要获得第四个参数,您可以使用”!xyz:4″。所有的参数都可以通过”!*”来获得。

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

    处理两个或更多的参数

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

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

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

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

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

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

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

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

    以关键字为基础执行命令

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

    6. !!操作符的威力

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

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

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

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

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

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

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

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

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

    $ su -c !! root

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

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

    !!操作符的威力

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

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

    $ apt-get upgrade && apt-get dist-upgrade

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

    $ su -c !!

    同样的适用于:

    $ service apache2 start

    或

    $ /etc/init.d/apache2 start

    或

    $ systemctl start apache2

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

    $ su -c 'service apache2 start'

    或

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

    或

    $ su -c 'systemctl start apache2'

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

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

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

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

    $ rm !(2.txt)

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

    $ rm !(*.pdf)

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

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

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

    $ [ ! -d /home/avi/Tecmint ] && printf '/nno such /home/avi/Tecmint directory exist/n' || printf '/n/home/avi/Tecmint directory exist/n'

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

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

    $ [ ! -d /home/avi/Tecmint ] && exit

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

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

    [ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。