为什么这个Java代码打印两个参数?

时间:2017-07-12 13:29:20

标签: java linux bash

当我将!clear作为输入传递时,下面的Java代码会输出两个参数。

class Test{

    public static void main(final String... arguments){
        for(String argument : arguments){
            System.out.println(argument);
        }
    }

}

输出:

$ java Test !clear
java Test clear
clear

更新

使用任何linux命令代替clear会产生相同的结果。

$ java Test !pwd
java Test pwd
pwd

$ java Test !ls
java Test ls
ls

我知道这与bash中的历史扩展有关,我可以逃脱!解决这个问题的角色。

但是,我很想知道此代码将上述两行打印为输出的确切原因。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

您在Unix / Linux shell中工作,可能是bash!字符是Unix shell中的特殊字符,因此您的命令被视为历史记录扩展。

在历史扩展中,通常会发生的事情是shell会显示命令扩展到的内容。如果您的历史记录中包含!clear ,那么clear的扩展只会是clear ,因此展开的命令将为java Test clear 。然后shell 运行命令。 Java运行并且只看到一个参数 - clear,这就是它打印的内容。

相反,如果您运行

java Test '!clear'

(用单引号!)

Java将按原样获取参数!clear,而不进行历史记录扩展。

如果您使用的shell不在shell的命令历史记录中,您将收到“未找到事件错误”。如果你使用一个单词,在你的shell历史中,用一个参数启动一个命令,整个命令及其所有参数都将被替换。这是bash的所有部分,而不是Java。