分享
三行代码  ›  专栏  ›  技术社区  ›  Vic K

为什么在Java中用管道执行系统命令失败? - Why executing system command with pipeline in Java fail without whitespaces?

  •  0
  • Vic K  · 技术社区  · 1 周前

    在shell命令行中,这两个命令都是合法的,运行起来没有问题:

    # without whitespaces
    parted /dev/sdd print free -m|grep free
    

    # with whitespaces
    parted /dev/sdd print free -m | grep free
    

    然而,一旦我从Java运行它的前版本(没有白空间的一个版本),即:

    Runtime.getRuntime().exec("parted /dev/sdd print free -m|grep free")
    

    失败了:

    2019-09-10 18:33:34.012  WARN 2528 --- [           main] Utils      : Error running parted /dev/sdd print free -m|grep free: parted: invalid option -- '|'
    parted: invalid option -- 'g'
    parted: invalid option -- 'r'
    parted: invalid option -- 'e'
    parted: invalid option -- 'p'
    Usage: parted [-hlmsv] [-a<align>] [DEVICE [COMMAND [PARAMETERS]]...]
    

    但是,同一个Java命令行与后者的命令版本(一个带白字符)完全一致。
    明显地 '|' -当从Java运行时,符号不会被识别。问题是为什么?

    1 回复  |  直到 1 周前
        1
  •  2
  •   another-dave    1 周前

    Java使用的规则 exec 函数不是shell使用的规则。

    执行 splits into tokens based on whitespace .

    因此 foo|bar 只是一个象征。 相反,shell解析将把它当作3个独立的元素, foo , | bar . bash的手册页为您详细说明了bash处理。