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

当我传递!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

UPDATE

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

$java Test !pwd
java Test pwd
pwd

$java Test !ls
java Test ls
ls

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

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

最佳答案
您正在Unix / Linux shell中工作,可能是bash.的! character是Unix shell中的特殊字符,因此您的命令被视为历史扩展.

在历史扩展中,通常发生的事情是shell会向您显示命令扩展到的内容.如果您在历史记录中清除了命令,那么!clear的扩展将很简单,因此扩展命令将是java Test clear.然后shell运行命令. Java运行并且只看到一个参数 – 清楚,这就是它打印的内容.

相反,如果你运行

java Test '!clear'

(用单引号!)

Java将获得参数!明确,没有历史扩展.

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

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...