【问题标题】:Can not use /bin/zsh to compile a csharp program, but /bin/bash can不能使用 /bin/zsh 编译 csharp 程序,但是 /bin/bash 可以
【发布时间】:2016-08-02 17:28:09
【问题描述】:

我的环境

OSX 10.11.6
zsh 5.0.8 (x86_64-apple-darwin15.0)
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Mono C# compiler version 4.0.5.0

test.cs

class Test {
        public static void Main() {
                System.Console.WriteLine("hello, world");
        }
}

test.sh

#! /bin/bash

mcs -recurse:*.cs

我可以使用./test.sh来编译test.cs

但如果我将 test.sh 更改为

#! /bin/zsh

mcs -recurse:*.cs

错误显示

./test.sh:3: no matches found: -recurse:*.cs

那么,为什么我不能使用 zsh?

【问题讨论】:

    标签: c# bash mono zsh gmcs


    【解决方案1】:

    zsh 正在尝试将该单词中的 * 扩展为文件 glob,失败并引发错误。

    bash 做同样的事情,但默认情况下,它只是忽略 globbing 失败并保持单词完整(所以mcs 看到它期望的参数)。

    shopt -s failglob 添加到脚本顶部(对于bash),它也会失败。

    mcs 的参数中引用* 以避免这种情况。

    mcs -recurse:'*.cs'
    

    【讨论】:

      【解决方案2】:

      因为字符串-recurse:*.cs 包含一个不带引号的*,所以大多数shell 会尝试将其视为一个glob 模式并将其扩展为一个或多个匹配的文件名。

      zsh 中的默认行为是将没有匹配的模式视为错误,而不是将模式视为文字字符串。如果启用failglob 选项,则在bash 中可以看到相同的行为。

      $ echo foo*
      foo*
      $ shopt -s failglob
      $ echo foo*
      bash: no match: foo*
      

      zsh 中,引用模式:

      #! /bin/zsh
      
      mcs -recurse:"*.cs"
      

      关闭NOMATCH 选项,

      #! /bin/zsh
      
      setopt NO_NOMATCH
      mcs -recurse:*.cs
      

      或使用 zsh 命令修饰符:

      #! /bin/zsh
      
      noglob mcs -recurse:*.cs
      

      【讨论】:

        【解决方案3】:

        在您的命令mcs -recurse:*.cs 中,* 旨在作为参数的文字部分传递给mcs,但它对所有常见的 Unix shell(bashzshtcsh 等)作为路径名扩展的通配符。因此,如果工作目录中有一个名为 -recurse:oops.cs 的文件,您的命令可能会让您感到惊讶。

        当没有文件与给定模式匹配时,shell 的默认行为会有所不同。默认情况下,bash 回退到猜测您的意思是 * 是文字,这实际上就是您的意思。另一方面,zsh 由于未能匹配模式而表现出更传统的失败行为。通过打开failglob 选项,bash 也可以被诱导表现出这种行为。

        最好的解决方案是通过引用参数来解决歧义,或者至少转义其中的*bashzsh 都应该能很好地处理这个版本,没有任何特殊选项:

        mcs -recurse:\*.cs
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-24
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多