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

    IT技术网

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

    感叹号:bash 的历史扩展功能

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

    Bash 的历史扩展(History Expansion)又被称为 Bang(!) 命令,历史扩展是 bash 将历史命令转换到可执行命令的过程。Bash 下的 History 库提供了一个与 csh 下历史扩展类似的历史扩展功能。历史扩展中操作历史命令一般有两个部分:

    首先要从历史命令中找出相对应的命令,被选择到的命令我们称作为Event(条目),比如Bang Bang(!!),就是选择最后一条命令; 选择选定行的部分或全部文本以包含到当前行中。要操作的条目(Event)Bash将其拆分成了Words(词),命令中的Words是靠空格来分割的,我们就可以使用修饰符(Modifiers)来调整Words以符合我们的要求。注意:Words并不是英文单词,而是一个字符序列而已。

    感叹号:bash 的历史扩展功能

    先来看两个命令,你知道第二个命令是什么意思么?

    cat /tmp/cat.cat.txt
    !:0 !*:gs/cat./echo.

    条目标志符(Event Designators)

    条目标志符是一个到历史列表内一个命令行实体的引用,除非是绝对引用,不然条目的引用是相对历史列表中当前位置的。

    条目标志符 条目标志符说明
    ! 开始一个历史替换,除非后面紧跟的是空格,制表符,行结束符,”=”,”(“(当使用内建命令shopt开启了extglob的shell选项)。
    !n 重复历史中编号为n的命令——历史编号可以参看history命令.
    !-n 执行之前的第n条命令,执行上一条命令可以使用!!或者!-1,执行之前第三条命令:!-3,倒推的列表是history。
    !! 执行上一条命令,和Ctrl-P,!-1的作用一样。
    !string 执行最近的以string字串开头的命令。这个命令的意思是重复以!后字串开头的最后一条命令,比如:!ca将重复以字符ca开头的最后一条命令,如cat ReadMe,(假设最近一条ca开头是这个命令,并且ReadMe后紧跟换行符)
    ! string[ ] 在历史列表中以当前位置开始向后查找(往回搜索)包含string字符串的最近一条命令,假如要查找的string字符串后面紧跟换行符,则string后面的这个问号可以省略。例如:! Read 还是会匹配cat ReadMe。(同上的环境),假如后面是换行符如:! ReadMe,则不用输入结尾的[ ]。
    ^a^b 快速替换,把上一条命令中的a替换成b,并执行替换后的命令。^a^b^类似。注意:这里只是替换一个找到的实例,相当于:!!:s/a/b。
    ^abc 删除上一条命令中的abc。
    !# 引用目前输入的所有字串,如:more a !#;这个最终的命令是more a more a。

    词标志符(Word Designators)

    词标志符被用来在条目里面选择需要的词。一般用”:”分隔条目指示符和词指示符。当词指示符是以”^”,”$”,”*”,”-”,”%”开头时,也可能会省略”:”。词是从一行的行首开始,第一个词编号为0.插入到当前行中时,这些词使用单个空格分隔。

    词标志符 词标志符说明
    0 第0个词,在很多应用程序中,这就是命令本身。
    n 第n个词
    ^ 第一个参数;也就是第一个词。
    $ 最后一个参数。
    % 最近” string ”匹配的词。
    x-y 词的范围:假如是’0-y’可以简写成’-y’.
    * 除了第0个以外的所有词,这个和’1-$’同义,假如条目中只有一个词,使用’*'也不会返回错误,仅是返回一个空字符串而已。
    x* ‘x-$’的简写
    x- 和x*类似,都是’x-$’的简写,不过需要注意,这个写法是忽略最后一个词的。

    需要注意的是,在Bash下使用词指示符的时候,可以没有条目指示符,假如没有使用条目指示符,则会把前一条命令作为词指示符的操作条目。

    修饰符(Modifiers)

    在可选的词指示符之后,你可以添加下面修饰符中的一个或多个,每个修饰符以’:'开头。

    修饰符 修饰符说明
    h 去掉路径名的尾部,只保留头部。只移除最后一个’/'后面的内容,可以理解成是路径名的父目录。
    t 去掉路径名部件中除尾部之外的所有内容。只保留最后一个’/'后的内容。
    r 去掉尾部这样格式”.suffix”的一个结尾后缀,保留基本名称。只删除最后一个点’.'后的内容。
    e 仅保留后缀。仅保留最后一个点’.'及点后的内容。
    p 打印新的命令但不执行。
    q 引用替换的词,防止进一步替换。(译注,原文:Quote the substituted words, escapin further substitutions.——Mitchell Chu)。这个引用会直接对引用的命令加上单引号,防止进一步替换。开始这句不知道怎么翻译。后来Mitchell发现自己的这个翻译并没有错误,因为我们引用的词可能是个变量,这时候假如没有引号,就会引起进一步的替换,而是用此参数就能达到防止这种情况的发生。
    x 这个和q一样,是引用替换的词,但是这个与q不同的地方在于,q是整体引用,而这个是会将替换的词使用空格,制表符,换行符来分割成一个个的词。
    s/old/new/ 把条目行中找到的第一个old位置的内容替换成new位置的内容,’/'这个分隔符位置可以使用任何其他字符作为分隔符。假如要在old或new位置使用分隔符,需要使用反斜杆’/'来转义。假如’&’这个字符出现在new位置,将会被替换成old位置的内容,假如要使用’&’请用’/'转义。最后一个分隔符假如是整行的最后一个字符,则可以省略。
    & 重复上次替换。这个是引用最后一次的s/old/new/内容。
    g 见下,与a相同
    a 使替换在整个条目中进行,和’s'一起使用,例如:!!:gs/old/new/,或者和’&’一起使用。
    G 对条目中的每一个词都执行一次其后的’s'修饰符。这个方法在Bash 4.1.2下测试并不靠谱。

    test $eee /tmp/test.log
    echo !test:Gs/t/a/;
    ## 这个返回的test被替换两次
    ## 但后面的参数仅替换一次

    因此Mitchell在想,是不是仅对参数执行一次,而对命令(第0个词)进行全局替换。但另外一个测试,反驳了这个观点:

    aaaaaaaaaaa $aaaaaaa /tmp/aaaaaaaaaaaaa.log
    echo !aaaa:q:Gs/a/t/
    ## 此时,最多的替换出现在!:0,两次!

    但多次测试结果来看,第零个词汇被替换最多两次,其他只替换一次。具体原因暂时未知!

    了解了这些,我们来揭晓一下文章开头的命令的意义:

    我们首先是选出命令!!(!:0可以写成!!:0,!*同样可以写成!!*) 有了命令之后我们选择第二步,利用0,选择出词(!:0选择出来的是cat) 第三步是对词进行操作,这里是!*后面对参数进行了字符替换。 最后变成完成的命令了: cat /tmp/echo.echo.txt

    (注:转载时对原文有修改。)

    上一篇返回首页 下一篇

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

    别人在看

    正版 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键 取消该搜索窗口。