V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nikola
V2EX  ›  程序员

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

  •  
  •   nikola · 2018-11-22 22:57:56 +08:00 · 2269 次点击
    这是一个创建于 2198 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码很简单,就是依次打印 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 执行 clipboard.png

    • 用 windows 的控制台执行 clipboard.png

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

    10 条回复    2018-11-23 09:58:12 +08:00
    nikola
        1
    nikola  
    OP
       2018-11-22 23:24:34 +08:00
    第一次发图,原来的图不对

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

    * **用 windows 的控制台执行**
    ![]( )
    zjp
        2
    zjp  
       2018-11-22 23:35:13 +08:00 via Android
    引号用来包裹字符串,要输出引号用 \'。和 Java 对字符串的处理一样
    widewing
        3
    widewing  
       2018-11-23 02:29:28 +08:00 via Android
    windows 控制台对引号的处理我一直没搞懂。。
    msg7086
        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=''
    nikola
        5
    nikola  
    OP
       2018-11-23 09:27:23 +08:00
    @msg7086 是不是 shell 处理的时候,把 value 部分的引号''字符串处理成空字符串,然后再传递给 java 的 main。而不是直接把原字符串--dw-dive-auth=''直接传递给 main。因为不同的命令行实现,所以 shell 和 windows 控制台表现出不同的结果?
    nikola
        6
    nikola  
    OP
       2018-11-23 09:30:18 +08:00
    @widewing windows 控制台对于 args 可能是压根没处理,把 args 的原字符串原封不动的传给了 main,但是 shell 对 args 会有预处理
    nikola
        7
    nikola  
    OP
       2018-11-23 09:49:31 +08:00
    @msg7086 @widewing 其实 shell 和 win 命令行都会对 args 做预处理,然后传递给 main,单引号在 shell 里属于特殊符号,在 windows 命令行中使用的是双引号,当我传双引号的时候,结果就一样了。
    msg7086
        8
    msg7086  
       2018-11-23 09:54:14 +08:00
    CMD 只有双引号是转译的。Linux Shell 一般单双引号都会转译。
    no1xsyzy
        9
    no1xsyzy  
       2018-11-23 09:57:19 +08:00
    @nikola shell 里面 (') 是有特殊意义的,用单引号括起的文字不进行任何形式的转化(比如空格造成 arg 分隔、$引变量、\转义、"弱引用、<>|&管道、*通配文件),并消去单引号本身,所以常常用来传入一些单行解释器程序,比如 awk 或者 python。
    geelaw
        10
    geelaw  
       2018-11-23 09:58:12 +08:00 via iPhone
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:19 · PVG 21:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.