• history 命令历史


    在终端中按捉[Ctrl]键的同时[r]键,出现提示:(reverse-i-search),此时你尝试一下输入你以前输入过的命令,当你每输入一个字符 的时候,终端都会滚动显示你的历史命令。当显示到你想找的合适的历史命令的时候,直接[Enter],就执行了历史命令。另外,[Ctrl p]或[Ctrl n]快速向前或向后滚动查找一个历史命令,对于快速提取刚刚执行过不久的命令很有用。
    
    在shell中export HISTCONTROL=ignorespace,然后执行 空格+命令,此时命令不会记录到history中。
    
    1、!$ 命令返回前一个命令使用的文件名。使用感叹号 (!) 来访问历史,然后使用美元符号 ($) 返回前一命令的最后字段。
    vi !$
    
    2、!:1 操作符返回某个命令使用的第一个文件名。
    $ mv kxp12.c file_system_access.c
    $ ln –s !$ !:1
    重新命名文件 kxp12.c 以提高可读性,然后使用 link 命令来创建到原始文件名的符号链接,以防在其他位置使用
    该文件名。!$ 操作符返回 file_system_access.c 文件名,而 !:1 操作符返回 kxp12.c 文件名,该文件名是上个命令的第一个文件名。
    
    3sudo !!
    以root的身份执行上一条命令。 !!是上一条完成的命令行
    
    4、alt+.  或  esc.
        热建alt+. 或 esc+. 可以把上次命令行的参数给重复出来。
        alt+.需同时按下。
    
    5、!!:gs/old/new
        将上一条命令中的  old 字符 换成  new字符 ,并再次执行命令;
        也可以使用 ^old^new
    输入命令:
    ls abc def ghi
    再输入:
    !!*:s/b/d
    那么相当于执行: adc def ghi
    !!表示从命令历史列表中取上一条历史命令”ls abc def ghi”, *表示选择取刚才选择的命令的所有参数, 即: “abc def ghi”, :s/b/d表示对刚才取出来的参数”abc def ghi”进行替换, 把第一个出现的b替换成d
    
    从上面可以看出, 操作历史命令分为三步:
    1、首先从历史命令列表中选择某条命令, 被选择到的命令被称作事件(event) (对应上面的!!)
    2、再从选择好的事件中选择一部分单词(words), 事件中的每个单词以空格分割(对应上面的*)
    3、最后对选择好的一部分单词进行修改(Modifiers)
    
    详细:
    1事件指示器:Event Designators
       事件指示器用来从历史命令列表中选择一条命令, 也就是选择事件
    !n    选择历史命令列表中第n条命令
    !-n   选择倒数第n条命令
    !!    选择上一条命令, 相当于!-1, 和 C-p 的作用也一样
    !string   选择最近的以string开头的命令  
    !?string[?]    选择最近的包含string的命令, 如果该指示器后面是换行符, 则可以不用输入结尾的”?^string1^string2    取上一条命令, 并把第一个出现的string1替换成string2   
    !#    引用目前输入的所有命令, 比如输入:
            more a !#
            那么最终执行的命令就是:
            more a more a
    
    
    

    2单词指示器:Word Designators 单词指示器用来从被选择好的事件中选择一部分单词, 单词指示器必须以冒号(:)和事件指示器分割开来, 除非单词指示器以^, $, *, -, %开头
    0    选择第0个word, 也就是命令. 假如事件为”ls abc”, 那么单词指示器0选择的word即为”ls”    
    n    选择第n个word   
    ^    选择命令的第一个参数, 也就是第一个word, 相当于单词指示器1    
    $    选择命令的最后一个参数    
    %    选择最近的与 “?string?” 搜索相匹配的单词   
    x-y  选择第x到第y个word, -y表示0-y   
    *    选择命令的所有参数, 相当于1-$   
    x*   x-$的缩写   
    x-   类似x*, 不过不包含最后一个word. 
    -    选择除最后一个word外所有的words
    
    
    

    3修饰附:Modifiers 对选择的单词进行修改, 修饰符可以出现多次, 每个修饰符要以冒号开头
    p    打印新命令, 但不执行
    
    s/old/new/    把 第一次出现的 old替换成new, 如果分隔符”/”是最后一个字符的话, 可以省略. 就像sed中一样, 分隔符”/”可以用其他字符代替, 比如s:old:new:. new中出现的&将被old代替. 如果old省略, 那么就用上一次替换用的old代替.
    
    &    重复上一次替换
    
    g    使修饰符所做的修改应用于整个选择的单词. 类似于sed中的s命令最后的g, 可配合:s和:&修饰符使用, 比如:gs/old/new则对整个事件进行替换. 
    
    

    例子:

    (I)从别的机器的一个目录拷贝一个a.log文件, 执行:
        scp user@machine:/home/user/a/a.log .
    
    后来执行:
        ls a.log
        rm -rf a.log
    
    这时候再想拷贝一下b/b.log, 可以这样做:
        !scp:gs/a/b
    
    如果只想看看用历史扩展出来的命令, 那可以这样:
        !scp:gs/a/b/:p
    
    (II)从别的机器同时拷贝a/a.log和b/b.log:
        scp user@mbchine:/home/user/a/a.log . && !#-:gs/a/b
    上面的!#为事件指示器, 选择前面已经输入的命令”scp user@mbchine:/home/user/a/a.log . &&”, “-”为单词指示器, 选择除最后一个word, 即”&&”外的所有words, 也就是”scp user@mbchine:/home/user/a/a.log . “, 最后的”:gs/a/b”为修饰符, 对刚才选择的words进行全局替换, 把a替换成b, 最后就成了”scp user@mbchine:/home/user/b/b.log .”, 那么最终命令也就成了”scp user@mbchine:/home/user/a/a.log . && scp user@mbchine:/home/user/b/b.log .”
    
    

     

  • 相关阅读:
    Git更新或提交出错的解决办法
    webpack简单学习的入门教程
    CentOS源码安装QT
    后台程序在向tty/串口写数据的时候stop了
    Linux signal 处理
    Linux C 获取 文件的大小
    Microsoft Excel 标题栏或首行锁定
    Socket连接何时需要断开
    Windows MFC 打开文本
    动态库的生产和调用
  • 原文地址:https://www.cnblogs.com/openix/p/3532436.html
Copyright © 2020-2023  润新知