我发现⌥.(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
您也可以通过注释来做到这一点;:
如果您愿意使用不同的快捷方式,则不必切换到:
定义一个输出其最后一个位置参数的函数:
lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
创建一个调用的键绑定:
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 -S
。fc -p
确保命令行不会再次添加到历史记录中。