如何访问注释命令的最后一个参数

如何访问注释命令的最后一个参数

我发现.alt.对于许多其他人来说)在终端中工作时非常有用,在当前提示符处插入最后一行的最后一个参数。但是,当最后一行被注释时(假设set -o interactivecomments), 它不起作用。

我想不出确切的用例,但已经发生过好几次这样的情况:我注释掉了一个命令,我在执行之前意识到该命令不是我当时需要的,然后希望将其最终参数放在一个后续命令。

我意识到忽略所有注释掉的内容是有逻辑的,因为它从未被解释过,因此没有一个被标记为参数,有什么办法可以做我想做的事吗?

如果我必须使用不同的击键,绑定到可以执行我想要的操作的备用命令,这将不是理想的,但会是可用的。

我正在使用 Zsh,但 Bash 解决方案可能有效或接近我需要在 Zsh 中执行的操作。

答案1

不要注释掉该命令。

相反,将 a 放在:前面而不是#.这将使您的命令文本参数变为null 实用程序:,运行时不执行任何操作。参数被标记和解析,因为它仍然是一个命令,但没有对它们进行任何其他处理。


在某些情况下这是不合适的:特别是在计算命令时本身有副作用。一个简单的例子是命令替换:

$ : log $(find -print -delete) --target /var/run/cache

在这种情况下,内部的命令$(...)将被运行并替换为 的参数:,即使原始命令本身永远不会运行。破坏性较小的情况是${foo:=default}参数扩展,它具有为 赋值的副作用$foo

最后,重定向或管道仍然会发生:

$ : foo > outfile
$ : bar | grep x | ...

在这两种情况下都会将空输出发送到目标,这将截断或创建文件或运行后续命令,这可能不喜欢它们得到的空输入。


如果您对您的命令没有任何特殊担忧,那么这是完全安全的并且可以在桀骜,重击,以及任何 POSIX 兼容的 shell(尽管之后的 alt-. 行为并非在所有地方都有效)。

如果它是您想要的具体最后一个单词,zsh 提供了可自定义的键绑定和命令,您可以使用它们来操作命令行。如果您bindkey '^K' kill-region可以返回到单词之前,Ctrl-K擦除到行的开头,:,然后就可以使用安全命令,只留下您关心的一个单词。

答案2

您也可以通过注释来做到这一点;:如果您愿意使用不同的快捷方式,则不必切换到:

  1. 定义一个输出其最后一个位置参数的函数:

    lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
    
  2. 创建一个调用的键绑定:

    lastarg $(history 2 | head -1)
    

    并插入输出。

如果引用最后一个参数,这可能会由于分词而导致错误的结果。

引用的危险版本

如果您确信不会发生任何不好的事情(没有未引用的<, >, &, $(), \``,; ,# , and no0 single" or'` 那么您可以执行此操作,以便从注释行获取引用的最后一个“参数”:

# dummy foo\ \ \ bar
eval : $(history 2 | awk 'NR==1 { sub(" *[0-9]* *#",""); print; }') \; echo '"$_"'
    + eval : dummy 'foo\' '\' '\' bar ';' echo '"$_"'
    ++ : dummy 'foo   bar'
    ++ echo 'foo   bar'
    foo   bar

答案3

!$使用与最后一个参数相对应的shell 内置命令。

我也在使用 zsh,这可以在 shell 中访问注释命令的最后一个参数。

答案4

您可以添加到您的~/.zshrc

zshaddhistory() {
  local histchars=
  print -Sr -- ${1%$'\n'}
  fc -p
}

也就是说,在zshaddhistory将当前命令行添加到历史记录之前调用的特殊挂钩函数中,我们自己添加一个空的histchars,这将禁用 的注释处理print -Sfc -p确保命令行不会再次添加到历史记录中。

相关内容