以前的args快捷方式?

时间:2011-07-06 00:57:30

标签: bash

在bash中,我知道3个“来自前一个命令的args”快捷方式。他们是:

  1. !^ →首先arg,保留空格;
  2. $ _ →最后一个arg,空格保留;
  3. !* →所有args,空格保留;
  4. 那么还有更多像这样的arg vars /快捷方式吗? :)


    当我用一个命令调用一个文件时, $ _ 很有用,也就是说在另一个[长命名]目录中,然后想在我的下一个命令中再次调用它[即$ stat a\ b\ c/sub/folder/example.txt; mv $_ .],除非其中有空格,否则无效。

    为什么$ _不保留空格?要明白我的意思,请输入:

    $ echo "1" "One String Quoted"; for i in $_; do echo \"$i\"; done 并与

    进行比较

    $ echo 1 2 "3 4 5"; 然后按Enter 然后:$ for i in !*; do echo \"$i\" done;

    你能解释为什么你必须按回车^然后执行“for”循环才能使!*工作? [为什么$ _无需按Enter键即可工作(AKA,你可以用“;”来组合命令)]

4 个答案:

答案 0 :(得分:2)

$ _保留空格就好了。否则,它会给你一个乱七八糟的混乱或只是命令的后半部分。你想要的是在$ _附近添加引号,以便接收它的命令也保留空格。

所以,在你的例子中:

$ stat a\ b\ c/sub/folder/example.txt; mv "$_" .

答案 1 :(得分:2)

$执行变量扩展,!是历史扩展。要使!访问参数,您必须将命令添加到bash历史记录中,该命令在执行时/按Enter键时发生。

答案 2 :(得分:1)

如果您正确引用$_

"$_"将保留空格。它的行为与其他行为不同,因为它是history substitution的独立机制。

您可能想要查看的另一种机制是fc命令。

答案 3 :(得分:1)

使用!#访问当前行的参数:

$ echo 1 2 "3 4 5"; for i in !#:1-3; do echo ">$i<"; done
1 2 3 4 5
>1<
>2<
>3 4 5<

请参阅bash手册中的history expansion