【问题标题】:.NET Core on Linux: Is stdout redirected?Linux 上的 .NET Core:是否重定向了标准输出?
【发布时间】:2020-03-20 22:03:01
【问题描述】:

在 Windows 上,我使用此代码来确定是否为当前正在运行的进程重定向 stdout 流:

private static bool? isOutputRedirected;

public static bool IsOutputRedirected
{
    get
    {
        if (isOutputRedirected == null)
        {
            isOutputRedirected =
                GetFileType(GetStdHandle(StdHandle.Output)) != FileType.FileTypeChar ||
                !GetConsoleMode(GetStdHandle(StdHandle.Output), out _);
            // Additional GetConsoleMode check required to detect redirection to "nul"
        }
        return isOutputRedirected == true;
    }
}

private enum StdHandle : int
{
    Input = -10,
    Output = -11,
    Error = -12,
}

private enum FileType : uint
{
    FileTypeChar = 0x0002,
    FileTypeDisk = 0x0001,
    FileTypePipe = 0x0003,
    FileTypeRemote = 0x8000,
    FileTypeUnknown = 0x0000,
}

[DllImport("kernel32.dll")]
private static extern FileType GetFileType(IntPtr hFile);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(StdHandle nStdHandle);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);

我对其他两个标准流有类似的属性。

当显示进度信息或尝试用新内容更新当前行时,这是处理情况所必需的。这在重定向输出时没有用,因此应将输出简化为更简单的内容。

但在 Linux (dotnet publish -r linux-arm) 上运行时,这会按预期失败。

如何确定 Linux 上的相同情况?网络似乎对它一无所知(目前)。

【问题讨论】:

    标签: c# linux .net-core console


    【解决方案1】:

    对于 .NET Framework 4.5 及更高版本,您可能需要查看 Console.IsOutputRedirectedConsole.IsErrorRedirected

    来源:https://docs.microsoft.com/en-us/dotnet/api/system.console?view=netcore-3.1

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多