代码很简单,就是依次打印 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 执行
用 windows 的控制台执行
从结果中看,git bash 把--dw-hive-auth=''
等号后面单引号吞了(经测试,在 mac 终端上执行也会吞掉''
)。
推断是终端执行逻辑有差异,请问是否有相关资料解释这种现象?
1
nikola OP 第一次发图,原来的图不对
* **用 git bash 执行** ![]( ) * **用 windows 的控制台执行** ![]( ) |
2
zjp 2018-11-22 23:35:13 +08:00 via Android
引号用来包裹字符串,要输出引号用 \'。和 Java 对字符串的处理一样
|
3
widewing 2018-11-23 02:29:28 +08:00 via Android
windows 控制台对引号的处理我一直没搞懂。。
|
4
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='' |
5
nikola OP @msg7086 是不是 shell 处理的时候,把 value 部分的引号''字符串处理成空字符串,然后再传递给 java 的 main。而不是直接把原字符串--dw-dive-auth=''直接传递给 main。因为不同的命令行实现,所以 shell 和 windows 控制台表现出不同的结果?
|
6
nikola OP @widewing windows 控制台对于 args 可能是压根没处理,把 args 的原字符串原封不动的传给了 main,但是 shell 对 args 会有预处理
|
7
nikola OP |
8
msg7086 2018-11-23 09:54:14 +08:00
CMD 只有双引号是转译的。Linux Shell 一般单双引号都会转译。
|
9
no1xsyzy 2018-11-23 09:57:19 +08:00
@nikola shell 里面 (') 是有特殊意义的,用单引号括起的文字不进行任何形式的转化(比如空格造成 arg 分隔、$引变量、\转义、"弱引用、<>|&管道、*通配文件),并消去单引号本身,所以常常用来传入一些单行解释器程序,比如 awk 或者 python。
|
10
geelaw 2018-11-23 09:58:12 +08:00 via iPhone
|