이 작업을 수행할 때 예상했던 결과를 얻었습니다 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
두 쉘 모두에서 bash
이 zsh
유틸리티 [
는 쉘에 내장되어 있습니다. 이는 도구의 셸 구현으로, 바이너리보다 우선순위가 높습니다 /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 테스트 유틸리티 사양정의된 연산자 가 없습니다 ==
.