(旧闻,但万一别人的土地在这里寻找这一点,就像我只是做了)
OP似乎在寻找!#[X][-Y]
zsh的语法
,其中X和Y指标在历史事件壳字当前行
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}
不过请注意,我决然不会提倡这种使用情况作为一个特别有用的一个(甚至它作为一个例子健身,真的 - 但是我想指出别名的特殊性,因为我还没有看到它在其他地方提到)
适用于这种情况,但''#:1'中的'1'是来自line_的_start的_absolute标记index_,这意味着解决方案不能很好地概括;例如'mkdir -p tmp/sub && cd!#:1'会中断;您必须注意并计算该行上的所有标记以找到正确的索引。另外,由于shell _expands_历史记录引用并将_expanded_命令存储在历史记录中(除了在执行前将其打印出来),您无法返回并按typed_编辑命令 - 例如创建另一个目录。 - 你只会得到_expanded_版本。 (接下来)。 – mklement0
(续上)如果意图是获得_previous简单命令的__LAST_(扩展)令牌(如果不是,那么需要基于“!”的解决方案):当您使用时,所有这些问题都会消失'$ _',例如'mkdir -p tmp/sub && cd“$ _”'(为了安全,我用双引号'$ _')。我知道OP正在寻找您提供的历史扩展令牌,但考虑到这个问题的_intent_,我认为'$ _'是更好的选择。 – mklement0
有一个shell选项('histverify'),允许您在执行命令之前编辑该命令。 '$ _' * only *在意图使用最后一个参数时有效。 '!#'可能需要更多的工作,但它可以和你可能使用的任何命令行一起工作。 – chepner