获取上次使用的参数的父级的Bash快捷方式

获取上次使用的参数的父级的Bash快捷方式,bash,Bash,在我的工作流程中,我通常会: cat this/very/long/filename.txt cd !$ bash: cd: this/very/long/filename.txt: Not a directory 预计:( 现在我恢复最后一个命令,手动删除文件部分,然后重复现在可以工作的cd。这太多了 如果有bash这样的快捷方式就太好了: cd !§ 这可以给我最后使用的参数的父级。我知道,!§不存在,我只是希望它存在!有什么可以满足这一点吗?等等。历史修饰符来解救我 $ cd !!:$

在我的工作流程中,我通常会:

cat this/very/long/filename.txt
cd !$
bash: cd: this/very/long/filename.txt: Not a directory
预计:(

现在我恢复最后一个命令,手动删除文件部分,然后重复现在可以工作的
cd
。这太多了

如果有
bash
这样的快捷方式就太好了:

cd !§
这可以给我最后使用的参数的父级。我知道,
!§
不存在,我只是希望它存在!有什么可以满足这一点吗?

等等。历史修饰符来解救我

$ cd !!:$:h
可以缩写为

$ cd !$:h
此命令接受上一个命令的最后一个参数,并删除尾随路径名

详情如下:

  • !!
    扩展到上一个命令
  • :$
    展开到上一个命令的最后一个参数
  • :h
    获取标题;即删除文件名(这是上面最后一个参数的尾随部分)
  • 顺便说一句

    !!:$:t
    
    恰恰相反


    要深入讨论,请参阅。

    在本例中,我通常会这样做:(我有emacs密钥绑定)

    cd
    Alt-dotAlt-b(n次)Ctrl-K

    更好:

    cd
    Alt dotlt Backspace(n次)


    注意alt-b或alt-b可以多次按下,直到您对路径感到满意。

    此较短版本也适用:

    cd !$:h
    
    详情:

    • !$
      与表示上一个命令的最后一个参数的
      !!:$
      同义
    • 将修饰符与事件词指示符分开
    • h
      是删除尾部文件名组件的修饰符
    • !!
      指的是最后一个命令
    • ^
      第一个参数,第二个单词(单词指示符)
    • :h
      删除尾部路径名组件,保留头部(修改器)

    基于其他几个人给出的答案, 理想的工作流程是在
    cat this/very/long/filename.txt
    命令之后键入
    cd!$:h
    这个答案,
    cd!$:h
    ,在
    cd!$
    之后仍然有效,但是,一旦你犯了这个错误, 您可以使用更短的
    !:h
    ,它重复最后一个命令(
    cd this/very/long/filename.txt
    ), 但只取最后一句话的开头

    我用的是这些鲜为人知的速记:

    • !word\u指示符
      相当于
      !!:word\u指示符
      对于非数字单词_指示符(例如,
      !$
      相当于
      !!:$
      ),以及
    • !:修饰符
      相当于
      !!:修饰符
      (例如,
      !:h
      相当于
      !!:h

    代替导航历史,也可以考虑使用<代码> $< /Co>变量来引用前一个命令的最后一个参数(参见代码< >代码> BASH(1)的特殊参数部分。

    要进一步剥离文件名组件(“最后一个斜杠之后的所有内容,包括最后一个斜杠”),请使用参数展开(删除匹配的后缀模式):


    最后一个命令将是
    cd this/very/long
    ,因为
    /filename.txt
    被剥离。与历史扩展不同的是,此命令(
    cd${{u%/*}
    )被添加到历史记录中。

    谢谢!这不太容易键入(记住),但比我使用的工作流要好。
    !!$
    !$
    似乎等同于
    !!:$
    。区别是什么?当存在两个较短的备选方案时,为什么要使用
    !!:$
    !$
    确实是等效的(cf.)。我更新了我的答案。谢谢!@robertreale在
    :h
    :$
    中的冒号(
    )是什么意思?@Geek冒号只是一个分隔符。请看文档中的相关章节(我在回答中提供了一个链接)。我发现Alt Backspace更有用,因为它是向后删除word。绑定到unix文件名rubout的东西会更好,但默认情况下不绑定。@EtanReisner感谢您指出。我通常使用zsh,我有
    ctrl-w
    来删除word,但在bash中,
    ctrl-w
    用于删除word,not word,我没有找到合适的,所以我
    alt-b
    了几次。试过你的评论,
    alt-BS
    是关键。我可以建议这个问题对超级用户来说是很好的。SE?@konsolebox:(1)“我已经回答了
    cd!$:h
    。”是的,我知道。当我说,“在其他几个人给出的答案的基础上,理想的工作流程是键入
    cd!$:h
    …”,我承认之前的答案,并认为您的答案非常好。您希望我在我的答案中直呼您的名字吗?(2)我对您的答案投了反对票。@konsolebox:(3)“认真地[sic]为什么人们总是回答别人已经回答过的答案。“因为有不止一个可能的答案。例如,我相信我是第一个说
    !:h
    可以在
    cd!$
    之后使用的人。(4)而且,我相信我是第一个解释
    的人。(某物)
    通常可以缩写为
    !(某物)
    !:(某物)
    ——您随后复制了这些内容,但没有太多的概括性。“严重的(明显的打字错误)为什么人们总是回答别人已经回答的答案。”…因为有不止一个可能的答案。->我只是指我的具体答案
    cd!$:h
    。我希望你不是说我从你的或其他人那里复制的。
    cat this/very/long/filename.txt
    cd !!^:h
    cd this/very/long
    
    $ cat this/very/long/filename.txt
    $ cd ${_%/*}