2016-08-02 1 views
-1

내 ENV는 CSHARP 프로그램을 컴파일/빈/zsh을 사용하지만 할 수 없습니다/빈/bash는 할 수

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을 사용할 수 없습니다 보여줍니다?

답변

2

zsh은 해당 단어의 *을 파일 glob, 실패 및 오류 발생으로 확장하려고 시도하고 있습니다.

bash도 마찬가지지만 기본적으로 globbing 실패를 무시하고 단어 그대로 유지합니다. 따라서 mcs은 예상되는 인수를 봅니다.

bash의 경우 스크립트 상단에 shopt -s failglob을 추가하면 실패합니다.

이 문제를 방지하려면 인수에 *을 인용하십시오. 문자열 -recurse:*.cs 인용 부호가없는 * 포함되어 있기 때문에

mcs -recurse:'*.cs' 
2

, 대부분의 조개는 글로브 패턴으로 취급 하나 이상의 일치하는 파일 이름을 확장하려고합니다.

zsh의 기본 동작은 패턴을 리터럴 문자열로 처리하는 대신 오류가있는 패턴을 오류로 처리하는 것입니다. failglob 옵션을 사용하면 동일한 동작을 bash에서 볼 수 있습니다. zsh을 명령 변경자 NOMATCH 옵션을 해제

#! /bin/zsh 

mcs -recurse:"*.cs" 

차례,

#! /bin/zsh 

setopt NO_NOMATCH 
mcs -recurse:*.cs 

또는 사용 :

#! /bin/zsh 

noglob mcs -recurse:*.cs 
1

에서를 zsh에서

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

어느 패턴을 인용 에야디야 ur 명령어 mcs -recurse:*.cs 인 경우 *은 인자의 리터럴 부분으로 mcs으로 전달하려고하지만 경로명 확장을위한 와일드 카드로 모든 일반적인 유닉스 쉘 (bash, zsh, tcsh 및 기타)에도 의미가 있습니다. 따라서 작업 디렉토리에 -recurse:oops.cs이라는 파일이 있다면 사용자의 명령에 놀라게 될 것입니다.

주어진 패턴과 일치하는 파일이 없으면 쉘의 기본 동작에 차이가 발생합니다. 기본적으로 bash*이 리터럴이라는 것을 의미하는 것으로 추측합니다. 실제로는 이것이 의미하는 바입니다. 반대로 zsh은 패턴을 일치시키지 못했기 때문에 더 일반적인 실패 동작을 나타냅니다. bash도 해당 동작을 표시하도록 유도 될 수 있습니다. failglob 옵션을 설정합니다.

가장 좋은 해결책은 인수를 인용하거나 적어도 *을 이스케이프 처리하여 모호성을 해결하는 것입니다. bashzsh은 특별한 옵션없이이 버전을 잘 처리해야합니다.

mcs -recurse:\*.cs