Bash在同一行中引用前面的参数
我似乎记得,Bash在同一行中引用前面的参数,bash,zsh,shortcut,Bash,Zsh,Shortcut,我似乎记得,bash有一个很好的快捷方式来引用同一行中的内容。我知道并使用$,和朋友定期联系。我记得Read能够做如下事情: mkdir tmp && cd !_ 其中_表示我不记得的组合。(上面的目标是创建一个目录,并在成功后立即cd)Google只会生成相同的2个参考表的重新发布,而这2个参考表没有这种组合 现在我用的是效率较低的 mkdir tmp cd !$ 它完成了任务,但不是我想要的方式 有人知道这条难以捉摸的捷径吗? 如果这很重要,我将zsh与oh my zsh
bash
有一个很好的快捷方式来引用同一行中的内容。我知道并使用$代码>,代码>和朋友定期联系。我记得Read能够做如下事情:
mkdir tmp && cd !_
其中_代码>表示我不记得的组合。(上面的目标是创建一个目录,并在成功后立即cd
)Google只会生成相同的2个参考表的重新发布,而这2个参考表没有这种组合
现在我用的是效率较低的
mkdir tmp
cd !$
它完成了任务,但不是我想要的方式
有人知道这条难以捉摸的捷径吗?
如果这很重要,我将zsh
与oh my zsh
一起使用,而不是香草bash
mkdir tmp && cd "$_"
我相信这就是你想要的(如果你确定不需要引用,你可以去掉双引号)
$\ucode>在不同的上下文中进行了不同的扩展,但这里最重要的是(来自man bash
,v3.2.51):
展开到展开后上一个命令的最后一个参数
背景:
注意:下面讨论了bash
,但它似乎在原则上也适用于zsh
$
是一个所谓的特殊参数,您可以在man bash
的特殊参数
部分的其他参数中找到它(不带$
前缀):
- 可以在交互式shell和脚本中使用
- 在单个命令级别工作,而不是在行级别
相比之下,代码>-前缀标记(例如!$
以调用最近一行的最后一个标记)与shell的[command]历史扩展相关(man bash
的历史扩展部分
):
- 默认情况下,它们仅在交互式shell中工作,但可以通过
set-o history
和set-o histexpand
(谢谢,@chepner))进行更改
- 在行级别工作(更准确地说:通过一次
Enter
击键提交的所有内容,无论它包含多少个单独的命令或行)
这是怎么回事:
mkdir foo; cd $_
适合我。#到目前为止,代码>引用了命令行,您可以从中提取特定的单词:
mkdir tmp && cd !#:1
同样的语法也适用于zsh
。(老消息,但万一有人来这里找这个,就像我刚才做的那样)
OP似乎在寻找#[十] [-Y]
zsh语法
其中X和Y是当前行的历史事件中shell字的索引
假设X和Y是指直线的起点或终点-
分别-省略时
(请记住,此上下文中的行尾实际上是行内发生的!#[X][Y]
事件调用)
这为我们提供了以下变体:
#代码>当前行到#代码>
#-Y
当前排列第Y个字
#X
X
-仅限第个单词
#X-Y
wordsX
到Y
#X-
从X
-第个单词,直到#X-
直接响应给出的示例:
或者,更进一步:
alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'
路径/tmp/${PWD:t}
也将被创建,如果由于某种原因无法创建/tmp
,则该路径将作为cd
的替代路径(该路径将以静默方式失败)
这假设用户可以在/tmp
中mkdir
,并愿意在/tmp
完全可用且事实上已选择时生成一些无用的路径(并保持不变)
当/tmp/${PWD:t}
已经存在且其内容无关且不受干扰时,会出现潜在问题,因此PWD;ls
别名有助于处理用例,例如somecommand;mktmpd
通常情况下#2-3将不再引用适当的参数tmp
/tmp/${PWD:t}
但是请注意,我坚决不主张将此用例作为一个特别有用的用例(或者说它的适用性作为一个例子,真的-但我想指出别名的特殊性,因为我还没有在其他地方提到过它)在手边的用例中工作得很好,但是中的1
!\1
是从行首开始的绝对标记索引,这意味着解决方案的通用性不好;e、 例如,mkdir-ptmp/sub&&cd!#1
会断裂;您必须注意并计算行中的所有标记,以找到正确的索引。此外,由于shell扩展了历史引用并将扩展的命令存储在历史记录中(除了在执行之前打印它之外),因此您无法返回并编辑键入的命令-例如,创建另一个目录。-你只能得到扩展版。(下面继续)。(上面继续)如果目的是获取上一个简单命令的最后(扩展)令牌(如果不是,则需要基于!
的解决方案):当您使用$
时,所有这些问题都会消失,例如mkdir-p tmp/sub&&cd“$”
(为了安全起见,我双引号$
)。我知道OP正在寻找您提供的历史扩展令牌,但考虑到问题的意图,我认为$\uucode>是更好的选择。有一个shell选项(histverify
)允许您在执行命令之前编辑命令<代码>$\uuu
仅在意图使用最后一个参数时有效<代码>#代码>可能需要更多的工作,但它可以与您可能使用的任何命令行一起工作;不知道shopt-s histverify
-handy(对于bash;zsh等价物:alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'