【问题标题】:Getting the command line interpreter获取命令行解释器
【发布时间】:2017-11-19 10:47:56
【问题描述】:

我的application 接受一个字符串命令并在某个过程中重复执行它,每次都使用不同的环境变量。为了支持任何类型的命令,我使用指定的命令运行cmd /C,系统负责解析和运行命令。但是,我考虑通过在这些系统上调用 sh -c 来使应用程序与 Unix .NET 实现兼容。

所以,我想以最便携的方式确定两件事 - 应该执行的正确解释器(cmd 在 Windows 上,sh 或可能在 Unix 上由用户指定)以及它接受的变量样式(%var% 在 Windows 上,$var 在 Unix 上)。

目前,我考虑检查COMSPEC 环境变量是否指向Windows 样式的命令行解释器并使用它,或者查找SHELL 变量并使用它。是否有更好的管理替代方案,或者这是否足够?

【问题讨论】:

    标签: c# .net windows shell unix


    【解决方案1】:

    我可能在这里误解了一些东西,但为什么不使用System.Environment.OSVersion.Platform?

    【讨论】:

    • 一个可能的解决方案,但不是那么便携。它只会告诉我是否应该寻找 COMSPEC 或 SHELL 变量来找到确切的命令行解释器。
    【解决方案2】:

    我已决定检查 SHELL 和 COMSPEC 环境变量以找到正确的解释器及其规范。

    static void GetSystemShell(out bool comspec, out string fileName, out string arguments)
    {
        fileName = Environment.GetEnvironmentVariable("COMSPEC");
        if(fileName != null)
        {
            comspec = true;
        }else{
            fileName = Environment.GetEnvironmentVariable("SHELL");
            if(fileName != null)
            {
                comspec = false;
            }else{
                fileName = "cmd";
                comspec = true;
            }
        }
    
        if(comspec)
        {
            arguments = "/C";
        }else{
            arguments = "-c";
        }
    }
    

    如果设置了两个变量,它更喜欢COMSPEC 兼容的解释器。将命令传递给解释器的工作方式之间也存在差异,SHELL 期望命令作为一个(正确转义的)参数,而 COMSPEC 只需将命令包含在额外的引号中即可获得最佳效果。

    【讨论】:

      猜你喜欢
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多