用不同的终端执行 jar 程序, main 接收到的 args 内容会不一致

2018-11-22 22:57:56 +08:00
 nikola

代码很简单,就是依次打印 args 内容

public class Main {

    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(arg);
        }
        System.out.println();
        // write your code here
    }
}

编译打包成 jar 文件,在不同的控制台终端执行同样的命令java -jar testcmd.jar --dw-hive-auth='',注意这里=号后面是带两个单引号的。

从结果中看,git bash 把--dw-hive-auth=''等号后面单引号吞了(经测试,在 mac 终端上执行也会吞掉'')。 推断是终端执行逻辑有差异,请问是否有相关资料解释这种现象?

2270 次点击
所在节点    程序员
10 条回复
nikola
2018-11-22 23:24:34 +08:00
第一次发图,原来的图不对

* **用 git bash 执行**
![]( )

* **用 windows 的控制台执行**
![]( )
zjp
2018-11-22 23:35:13 +08:00
引号用来包裹字符串,要输出引号用 \'。和 Java 对字符串的处理一样
widewing
2018-11-23 02:29:28 +08:00
windows 控制台对引号的处理我一直没搞懂。。
msg7086
2018-11-23 03:54:30 +08:00
引号会被 shell 解释,当然会被吞掉。要保留单引号可以用

"--dw-hive-auth=''" 或者 --dw-dive-auth="''"

例:

root@debian-ws:~# echo --dw-dive-auth="''"
--dw-dive-auth=''
nikola
2018-11-23 09:27:23 +08:00
@msg7086 是不是 shell 处理的时候,把 value 部分的引号''字符串处理成空字符串,然后再传递给 java 的 main。而不是直接把原字符串--dw-dive-auth=''直接传递给 main。因为不同的命令行实现,所以 shell 和 windows 控制台表现出不同的结果?
nikola
2018-11-23 09:30:18 +08:00
@widewing windows 控制台对于 args 可能是压根没处理,把 args 的原字符串原封不动的传给了 main,但是 shell 对 args 会有预处理
nikola
2018-11-23 09:49:31 +08:00
@msg7086 @widewing 其实 shell 和 win 命令行都会对 args 做预处理,然后传递给 main,单引号在 shell 里属于特殊符号,在 windows 命令行中使用的是双引号,当我传双引号的时候,结果就一样了。
msg7086
2018-11-23 09:54:14 +08:00
CMD 只有双引号是转译的。Linux Shell 一般单双引号都会转译。
no1xsyzy
2018-11-23 09:57:19 +08:00
@nikola shell 里面 (') 是有特殊意义的,用单引号括起的文字不进行任何形式的转化(比如空格造成 arg 分隔、$引变量、\转义、"弱引用、<>|&管道、*通配文件),并消去单引号本身,所以常常用来传入一些单行解释器程序,比如 awk 或者 python。
geelaw
2018-11-23 09:58:12 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510570

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX