使用 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.
也能正常工作
我遇到一个问题,即长格式参数没有正确传递给特定的命令行实用程序。
所有这些都有效:
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.