我遇到一个问题,即长格式参数未正确传递给特定的命令行实用程序。
所有这些都有效:
Command::new("mpg321").arg("--gain 100").arg("file.mp3").spawn().unwrap()
Command::new("mpg123").arg("-h 2").arg("file.mp3").spawn().unwrap()
mpg123 --halfspeed 2 file.mp3
但是这个:
Command::new("mpg123").arg("--halfspeed 2").arg("file.mp3").spawn().unwrap()
返回:
mpg123: Unknown option "halfspeed 2"
我怀疑故障位于mpg123
侧,但这并不完全合理,因为它在从命令行调用时有效。
答案 0 :(得分:4)
--halfspeed 2
是两个论点。你应该拨打arg
两次:
Command::new("mpg123").arg("--halfspeed").arg("2").arg("file.mp3")...
使用.args
将所有参数作为数组传递:
Command::new("mpg123").args(&["--halfspeed", "2", "file.mp3"])...
答案 1 :(得分:3)
mpg123期望这样调用:mpg123 --halfspeed 2 file.mp3
,这使得argv
看起来像{"mpg123", "--halfspeed", "2", "file.mp3"}
。您调用它的方式相当于mpg123 "--halfspeed 3" file.mp3
,这使得argv
成为{"mpg123", "--halfspeed 2", "file.mp3"}
,mpg123
无法理解。
"-h 2"
工作的原因是单个字母选项可以在没有空格的情况下使用(意味着你可以只写-h2
),所以对于那些参数解析器需要能够处理的情况选项的字母和值在同一个argv
条目中。显然,即使argv
条目包含空格,逻辑也会以这种方式实现。