我似乎记得bash
有一个快捷方式,用于引用同一行中的某些内容。我知道并定期使用!$
,!!
和朋友。我记得阅读能够做如下的事情:
mkdir tmp && cd !_
其中!_
表示我不记得的组合。 (上述目标是成功创建一个目录并立即cd
。)Google只会产生相同的2个参考表的重新发布,这些参考表没有这个组合。
现在我正在使用效率较低的
mkdir tmp
cd !$
完成工作但不是我想要的方式。
有谁知道这个难以捉摸的捷径?
如果重要,我会将zsh
与oh-my-zsh
一起使用,而不是bash
。
答案 0 :(得分:7)
mkdir tmp && cd "$_"
我相信是您正在寻找的(如果您确定不需要报价,可以删除双引号。)
$_
在不同的上下文中有不同的扩展,但在此重要的是(来自man bash
,v3.2.51):
扩展后,扩展到上一个命令的最后一个参数。
<强>背景强>:
注意:以下内容讨论bash
,但原则上似乎也适用于zsh
。
$_
是一个所谓的特殊参数,您可以在$
部分的Special Parameters
部分中列出其他参数(不包含man bash
前缀) !
:
相比之下,!$
- 前缀标记(例如HISTORY EXPANSION
以调用最近行的最后一个标记)与shell的 [命令]历史记录扩展相关(部分{ {1}}的{1}}:
man bash
和set -o history
进行更改(感谢@chepner)。set -o histexpand
击键提交的所有内容,无论它包含多少个别命令或行,都是如此。答案 1 :(得分:6)
!#
指的是命令行,您可以从中提取特定的单词:
mkdir tmp && cd !#:1
同样的语法也适用于zsh
。
答案 2 :(得分:1)
这个怎么样:
mkdir foo; cd $_
适合我。
答案 3 :(得分:0)
(旧消息,但万一有人在这里寻找这个,就像我刚才那样)
OP似乎正在寻找!#[X][-Y]
zsh语法
其中X和Y是当前行
的历史事件中shell单词的索引假设X和Y指的是行的开头或结尾 - 分别 - 省略时
(请记住,此上下文中的行尾实际上是行内!#[X][-Y]
事件调用的发生)
这为我们提供了以下变体:
!#
目前排到!#
!#-Y
当前排队Y
- 字
!#X
X
- 仅限
!#X-Y
字X
至Y
!#X-
从X
开始,直到!#X-
mkdir tmp && cd !#2
或者,更进一步:
alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'
路径/tmp/${PWD:t}
也会被创建并作为cd
的替代方案,如果由于某种原因无法创建./tmp
(这将无声地失败)
这假设用户可以在mkdir
中/tmp
,并且当./tmp
完全可用并且实际上已选择
当/tmp/${PWD:t}
已经存在并且其内容无关且不受干扰时会出现潜在问题,因此pwd; ls
别名有助于somecommand; mktmpd
这样的用例,通常情况下!#2-3将不再引用相应的参数tmp
/tmp/${PWD:t}
但请注意,我绝对不提倡将此用例作为一个特别有用的用例(或者甚至它的适用性作为一个例子,真的 - 但我想指出别名的特殊性,因为我还没有看到它在其他地方提到过)