在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运行时,无法识别'|'-符号。问题是为什么?

最佳答案

Java exec函数使用的规则不是外壳程序使用的规则。

exec splits into tokens based on whitespace

因此foo|bar是单个令牌。
相比之下,Shell解析会将其视为3个独立的元素foo|bar。 bash的手册页为您详细介绍了bash处理。

10-08 19:57