Pipe参数自动添加额外引号致命令执行失败的排查求助
问题解决:Process调用ffprobe参数传递错误
核心问题
你错误地将ffprobe的所有命令行参数打包成单个字符串传入arguments数组,但Process的arguments要求每个命令行选项、选项值、路径都必须是数组的独立元素——终端里的引号是给shell解析用的,Process不需要这些额外引号。
错误原因分析
终端执行命令时,shell会自动把引号内的内容识别为单个参数,拆分出-v、error等独立项;但你直接把整串参数作为一个数组元素传给Process时,ffprobe会把这一整串当成-v选项的参数,导致报错"Missing argument for option...",末尾的引号其实是ffprobe错误信息里自动添加的格式化内容,并非你传入的。
正确调用方式
把每个参数拆分为数组的独立元素,不需要给带空格的路径加引号:
// 示例调用 let ffprobePath = "/Users/dirk/Library/Developer/Xcode/DerivedData/DSPhotoStructureCleaner-awiixodrflmeajgbqdlklycdiewu/Build/Products/Debug/ffprobe" let arguments = [ "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=codec_name", "-of", "default=noprint_wrappers=1:nokey=1", "/Users/Shared/MeinDesktop/_Import Fotos/Test/_ORG/IMG_356308_2024.02.11-20.11.07_EOS5D4.MOV" ] let output = shell(launchPath: ffprobePath, arguments: arguments) print(output) // 会输出 mjpeg
补充说明
Process直接与目标进程交互,绕过了shell的参数解析步骤,因此:
- 不需要用引号包裹带空格的路径,每个参数作为数组元素即可避免拆分
- 必须将命令行的每个选项(如
-v)和对应的取值(如error)拆分为独立的数组元素,不能合并成一个字符串
内容的提问来源于stack exchange,提问作者Peter Silie
相关产品推荐
相关产品推荐

