使用 std::process::Command 时未正确传递长格式参数

Long-form arguments aren't passed correctly when using std::process::Command

我遇到一个问题,即长格式参数没有正确传递给特定的命令行实用程序。

所有这些都有效:

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()

Returns:

mpg123: Unknown option "halfspeed 2"

我怀疑故障出在 mpg123 一侧,但这并不完全合理,因为从命令行调用时它会起作用。

--halfspeed 2 是两个参数。你应该调用 arg 两次:

Command::new("mpg123").arg("--halfspeed").arg("2").arg("file.mp3")...

或使用 .args:

将所有参数一起作为数组传递
Command::new("mpg123").args(&["--halfspeed", "2", "file.mp3"])...

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" 起作用的原因是单字母选项可以在没有 space 的情况下使用(意味着你可以只写 -h2),所以对于那些参数解析器需要能够处理选项的字母和值在同一个 argv 条目中的情况。显然,逻辑的实现方式即使 argv 条目包含 space.

也能正常工作