`[ ... ]`의 `==`가 zsh와 bash에서 다르게 동작하는 이유는 무엇입니까?

`[ ... ]`의 `==`가 zsh와 bash에서 다르게 동작하는 이유는 무엇입니까?

이 작업을 수행할 때 예상했던 결과를 얻었습니다 bash.

[ "a" == "a" ] && echo yes

그것은 나에게 주어졌습니다 yes.

하지만 에서 이 작업을 수행하면 zsh다음과 같은 결과가 나타납니다.

zsh: = not found

동일한 명령( /usr/bin/[)이 다른 쉘에서 다르게 동작하는 이유는 무엇입니까?

답변1

/usr/bin/[그것은 어떤 껍질에도 없습니다 . Bash에서는 다음을 사용합니다.내장 test/ [명령, 그리고마찬가지로 zsh에서도.

차이점은 다음과 같습니다.=zsh에는 확장 기능도 있습니다: =foo실행 파일의 경로를 확장합니다 foo. 이것은 의미한다===명령에서 호출된 명령을 찾으려고 시도하는 것으로 처리됩니다.PATH. 명령이 존재하지 않으므로 오류가 발생합니다.

zsh: = not found

알다시피(실제로 실제로 사용하더라도 같은 일이 발생합니다 /usr/bin/[).


할 수 있는==정말 필요하신 분들은 여기를 이용해 보세요. 이는 zsh에서 예상한 대로 작동합니다.

[ "a" "==" "a" ] && echo yes

참조로 인해 =word확장 프로그램이 실행되지 않기 때문입니다. 를 사용하여 이 equals옵션을 비활성화할 수도 있습니다 setopt noequals.


그러나 다음과 같이 하는 것이 좋습니다.

  • 사용 순서=, POSIX 호환 평등 테스트;또는
  • 심지어 더 좋은 건,[[조건문을 다음과 함께 사용하세요 .==동시에불다그리고다루기 힘든. 일반적으로 [[이러한 문제(및 기타 문제)를 방지하려면 내부적으로 특수 구문 분석 규칙을 포함하는 것이 더 좋고 안전합니다.

답변2

[Bash 및 zsh에 내장된 쉘 명령입니다.

$ type [
[ is a shell builtin

~에서쉘 내장 명령문서:

내장 명령은 다음과 같습니다.껍질 자체에 들어있는. 내장된 명령의 이름이 간단한 명령의 첫 번째 단어로 사용되는 경우(참조:간단한 명령), 쉘은 다른 프로그램을 호출하지 않고 직접 명령을 실행합니다. 별도의 유틸리티를 사용하여 얻을 수 없거나 편리하지 않은 기능을 구현하려면 내장 명령이 필요합니다.

공식 문서( $ help test)에서는 다음 항목만 사용할 수 있습니다 =.

문자열1 = 문자열2

문자열이 같으면 참입니다.

따라서 올바른 표현은 다음과 같습니다.

$ [ "a" = "a" ] && echo yes
yes

무슨 일이 일어나는지는 bash가 덜 엄격하다는 것입니다. 지원 ==통신사[ bash 확장인 것 같습니다.그리고 그 사용은 권장되지 않습니다:

문자열1 == 문자열2

문자열1 = 문자열2

문자열이 같으면 참입니다. [[ 명령과 함께 사용하면 위에서 설명한 대로 패턴 일치를 수행합니다(참조:조건부 구조).

POSIX 준수를 보장하려면 테스트 명령과 함께 '='를 사용해야 합니다.

를 사용하려면 다음 키워드를 ==사용해야 합니다 [[.

$ [[ "a" == "a" ]] && echo yes
yes

[[이식성이 떨어진다는 점을 명심하세요 (POSIX 아님). 그러나 bash와 zsh는 모두 이를 지원합니다.

답변3

zsh와 bash는 동일한 답변을 제공합니다( type두 쉘 모두 내장되어 있음).

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

답변4

두 쉘 모두에서 bashzsh유틸리티 [는 쉘에 내장되어 있습니다. 이는 도구의 셸 구현으로, 바이너리보다 우선순위가 높습니다 /usr/bin/[. 경험하는 다른 결과는 다른 구현으로 인해 발생합니다.


에서 유틸리티 bash[복합 CONDITIONAL EXPRESSIONS명령을 허용합니다 [[. bashs 매뉴얼 페이지에 따르면 =및 둘 다 ==유효합니다.

string1 == string2
string1 = string2
        True if the strings are equal.  = should be used with the test command for POSIX
        conformance.

에서 zsh[유틸리티는 POSIX 및 해당 확장 기능을 구현하려고 시도합니다. 내부에POSIX 테스트 유틸리티 사양정의된 연산자 가 없습니다 ==.

관련 정보