在 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>
执行。command2
command1
答案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}