执行cat命令覆盖文件

Execute cat command to overwrite file

我正在尝试从我的 C# 代码执行 cat 命令,但我 运行 遇到了问题。

所以,这只是一个非常简单的测试,但我最终得到了错误:

错误: cat: '>': 没有那个文件或目录

现在...源文件和目标文件都实际存在..如果目标文件不存在,结果相同。

如果我在 Raspberry Pi 上打开一个控制台,它执行得很好。非常感谢任何帮助。

我的代码:

        var srcFile = "/home/pi/tm-satellite/Helpers/wpa_supplicant.conf";
        var outFile = "/home/pi/tm-satellite/network-test.txt";

        StringBuilder sb = new StringBuilder();

        var info = new ProcessStartInfo();
        info.FileName = "/bin/bash";
        info.Arguments = $"-c 'cat {srcFile} > {outFile}'";

        info.UseShellExecute = false;
        info.CreateNoWindow = true;

        info.RedirectStandardOutput = true;
        info.RedirectStandardError = true;

        var p = Process.Start(info);

        //* Read the output (or the error)
        sb.AppendLine($"Args: {info.Arguments}");
        sb.AppendLine($"Output: {p!.StandardOutput.ReadToEnd()}");
        sb.AppendLine($"Error: {p!.StandardError.ReadToEnd()}");
        
        p!.WaitForExit();

        return $"Overwrite system file {path}: {p.ExitCode}{Environment.NewLine}{sb}";

这是因为您将 cat 程序传递给 > 参数。

> 仅在 bashsh 过程中有意义,它告诉解释器 stdout 输出应转储到 file。这不是 cat.

的有效参数

要解决这个问题,请在 shell:

中调用 cat 进程
sh -c 'cat file1 > file2'

在 C# 中

var srcFile = "/home/pi/tm-satellite/Helpers/wpa_supplicant.conf"
var outFile = "/home/pi/tm-satellite/network-test.txt"
var info = new ProcessStartInfo();
info.FileName = "sh";
info.Arguments = $"-c 'cat {srcFile} > {outFile}'";

或者,您可以使用 C# 的 File 实用程序读取第一个文件并将其内容写入第二个文件,因为操作较少 I/O 可能会更快。


我已经修复了样本。使用双引号代替单引号:

var srcFile = "~/bad";
var outFile = "~/good";
                
var pInfo = new ProcessStartInfo()
{
  FileName = "sh",
  Arguments = $"-c \"cat {srcFile} > {outFile}\""
};

var process = Process.Start(pInfo);
process.WaitForExit();