“$_”的未扩展版本是什么?

“$_”的未扩展版本是什么?

在 bash/zsh 中,我们使用$_表示上一个命令的最后一个参数以供以后使用,但此参数包含文档中的“扩展版本”。有什么东西我可以拥有它的未扩展版本吗?就像下面的例子:

printf "%s\n" something{1..3}

我想在后面的命令中访问未扩展的something{1..3}参数,而不仅仅是something3.

这样做也仍然只会增加最后一个论点,而不是所有人。

bash -c '
   printf "%s\n" "$@" && printf "%s\n" "$@"-add-something-more;
' _ something{1..3}

同样zsh,有没有一种方法可以在没有eval技巧的情况下实现这一点,我不喜欢使用这种方式,但想展示我到底想要拥有什么?

bash -c '
    eval printf "%s\\\n" "$@" && eval printf "%s\\\n" "$@"-add-something-more;
' _ 'something{1..3}'
something1
something2
something3
something1-add-something-more
something2-add-something-more
something3-add-something-more

笔记:

  • 从历史记录中读取不是一个选项,因为命令将在脚本内执行,并且参数将由用户传递给脚本。
  • 我使用语法仅在成功执行时才command1 "$@" && command2 "$@"<question-part>执行。command2command1

答案1

要多次重用参数列表,这通常是(匿名)函数或变量的用途。

zsh

() {cmd1 "$@" && cmd2 "$@"} something{1..3}
l=(something{1..3}); cmd1 $l && cmd2 $l

要将相同的字符串添加到每个参数,请使用以下$^array语法:

$ () {echo $@; echo $^@-more} a{1..3}
a1 a2 a3
a1-more a2-more a3-more

bash/ ksh/zsh等价物是"${@/%/-more}")。

要获得 的未扩展版本$_,您可以执行以下操作:

TRAPDEBUG() last_cmd=($cur_cmd) cur_cmd=("${(z)ZSH_DEBUG_CMD}") 

进而:

$ echo a{1..3}; echo $last_cmd[-1]
a1 a2 a3
a{1..3}

但请注意,DEBUG陷阱已执行每个子列表, 不是管道,更不用说命令。所以这对 不起作用echo a{1..3} && echo $last_cmd[-1]。你需要:

$ eval 'echo a{1..3}' && eval 'echo $last_cmd[-1]'
a1 a2 a3
a{1..3}

相关内容