如何从bash中的上一个命令获取特定参数?


31

在bash中,您可以用来!*从上一个命令中获取所有参数。例如,如果您这样做了cp /some/path /some/other/path,然后又做了mv !*,第二个命令将扩展为mv /some/path /some/other/path。

是否有类似这样的东西可用于从命令而不是全部命令中访问特定参数?

Answers:


38

在!*,!是历史扩展前缀,*是字标志这意味着所有的参数。您可以将常规语法记住为bang-line-colon-column(!第:几行)。有许多可能的快捷方式:默认行是前一行,默认列说明符是“ all”,并且如果列说明符是非数字的,则可以省略冒号(但!3表示第3行)。您可以使用!:0指命令名,!:1,!:2,等,是指连续的参数,!:$最后一句话,!:*所有的参数,等等。

另请参见这篇文章由迈克尔Mrozek在Unix的堆栈交换。


1
我自己尝试过,但是没有用。看后由Michale Mrozek后,它说,使用!:1,!:2。将版本与冒号一起使用后,它可以工作。
— Wuffers

@MrMan:糟糕,如果您将冒号与数字分开,则该数字将被解释为行号。对于那个很抱歉。
— 吉尔(Gilles)“所以,别再邪恶了”,2010年

没问题。那么,那么我认为这样做!1:1会指向第一行的第一个参数?
— Wuffers 2010年

4

就我个人而言,我真的不喜欢这种“带有感叹号的扩展”功能,即使您echo "Hello World!"在交互式外壳程序中尝试,该功能也可能会打扰(因此,假定它们将以非交互式模式运行的源脚本根本无法使用)。

因此,我set +o histexpand使用以下方法设置并开始调用参数:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

请注意,Esc技巧是因为我没有meta键。


我几乎从不在命令中使用感叹号。因此,感叹号方法非常适合我。
— Wuffers

然后享受它。Shell的众多功能中的许多功能仅针对少数用户而设计。
— Benoit

实际上,您不必逃避惊叹号。做echo 'Hello, orld!'。注意单引号而不是双引号。
— Wuffers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.