"존재 여부"(false/true)에 대한 논리적 검사가 아닌 경우 특정 명령을 "보장"하기 위해 이중 괄호를 사용하는 이유는 무엇입니까?

"존재 여부"(false/true)에 대한 논리적 검사가 아닌 경우 특정 명령을 "보장"하기 위해 이중 괄호를 사용하는 이유는 무엇입니까?

최근에 나는 내 스크립트의 특정 줄 뒤에 있는 점점 더 많은 쉘 구문과 논리를 알아내려고 노력해 왔으며 다음과 같은 질문이 있습니다. [[expression]]줄 실행에 어떤 가치도 가져오지 않는 예제의 목적은 무엇입니까? 따라서 건너뛸 수 있으며 ? 뒤에 있는 실제 표현식만 사용됩니다 [[]].

export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

내 가정은 이것이 일부 값이 누락된 경우(널 포인터 예외) 일종의 검사라고 생각하지만 연산자가 "[[]]"그런 작업을 수행하지 않는다고 생각합니까? 이 스크립트의 목표는 간단합니다. => sdk터미널에서 전역적으로 사용할 수 있도록 내보내는 것입니다.

답변1

이것-s file 조건식지정된 파일이 존재하고 비어 있지 않은지 확인합니다. 이것[[…]]복합 명령은 이중 대괄호로 묶인 표현식의 평가에 따라 적절한 상태로 종료됩니다.

그러므로

[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

$HOME/.sdkman/bin/sdkman-init.sh소스는 존재하고 비어 있지 않은 경우에만 제공 됩니다 .

export SDKMAN_DIR="$HOME/.sdkman"( 별도의 라인에 있다고 가정합니다 .)

답변2

내 로컬 컴퓨터에서 (그리고 경험으로 말하면) "["는 bash에서 /usr/bin/test의 별칭입니다. 분명히 [[그렇죠아니요/usr/bin/test/usr/bin/test(사이에 공백이 없기 때문에) 로 확장됩니다 . Bash(및 아마도 다른 쉘)에서 대괄호는 /usr/bin/test를 호출하는 대신 쉘의 내부 표현식 평가기를 사용하는 예약어입니다.

$HOME/.sdkman/bin/sdkman-init.sh변수를 설정한 후 파일 길이가 0이 아니면 여기에 있는 코드가 현재 셸에서 실행됩니다. 나는 이것의 목적이 무엇인지 모릅니다(길이가 0인 파일은 실제로 아무 것도 하지 않기 때문입니다).

관련 정보