在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处理。