为什么 Process.Start shell 命令在 Linux 中失败并显示“未终止的引号字符串”?

问题描述 投票:0回答:1

问题

我正在尝试从 C# 代码运行 7z 以提取一些文件。该命令在 Windows 下工作,或者如果我直接从 shell 运行它,而不是从代码运行它。也许它不完全一样,我没有意识到。

所以我这样做:

//Unpack dump with 7z
StringBuilder argument = new($"\"{Config.zipPath}\" x \"{dumpPath}\" -so | \"{Config.zipPath}\" x -y -si -ttar");
foreach (string file in new[] { "vn", "vn_titles" /* and other strings */ }) {
    argument.Append($" db/{file} db/{file}.header");
}
Process.Start(Config.shell, string.Format(Config.arguments, argument)).WaitForExit();

配置文件是加载到静态

Config
类中的键=值对列表。所以,它适用于 Windows:

shell=cmd.exe
zipPath=C:/Program Files/7-Zip-Zstandard/7z.exe
arguments=/C "{0}"

但不适用于 Linux:

shell=ash
zipPath=7z
arguments=-c '{0}'

那里的 ash 命令失败并出现错误:

x: line 0: syntax error: unterminated quoted string


我试过/检查过的一些事情

  • C# 代码运行没有错误,至少在它需要访问不存在的解压缩文件之前是这样。
  • Config.shell
    ash
  • string.Format(Config.arguments, argument)
    -c '"7z" x "dump.tar.zst" -so | "7z" x -y -si -ttar db/vn db/vn.header db/vn_titles db/vn_titles.header db/releases db/releases.header db/releases_titles db/releases_titles.header db/releases_vn db/releases_vn.header db/vn_length_votes db/vn_length_votes.header db/tags db/tags.header db/tags_parents db/tags_parents.header db/tags_vn db/tags_vn.header'
  • 基于前两点,我假设执行的命令是这两个命令的串联,即
    ash -c '"7z" x "dump.tar.zst" -so | "7z" x ... '
    ,并且该命令手动运行,按预期工作。所以我真的很难弄清楚问题出在哪里。
c# shell 7zip ash
1个回答
1
投票

-c '...'
必须恰好是两个参数(
-c
和引号内的任何内容)。我不确定
Process.Start(string, string)
重载如何将第二个参数拆分为命令行参数,但从你的问题来看,它似乎并没有像一个(或你的 shell)所期望的那样拆分它们:)

你想调用过载

Start(string, IEnumerable<string>)

Process.Start(Config.shell, new[]{ "-c",  argument })
© www.soinside.com 2019 - 2024. All rights reserved.