C# Linux上的.NET内核:是否重定向标准输出?

C# Linux上的.NET内核:是否重定向标准输出?,c#,linux,.net-core,console,C#,Linux,.net Core,Console,在Windows上,我使用以下代码确定是否为当前运行的进程重定向标准输出流: private static bool? isOutputRedirected; public static bool IsOutputRedirected { get { if (isOutputRedirected == null) { isOutputRedirected = GetFileType(GetS

在Windows上,我使用以下代码确定是否为当前运行的进程重定向标准输出流:

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上的相同情况?web似乎对此一无所知。

对于.NET Framework 4.5及更高版本,您可能需要查看
控制台。IsOutputRedirected
控制台。IsErrorRedirected

资料来源: