다음 Bash(v 5.1.4) 스크립트
#!/usr/bin/env bash
echo $BASHOPTS
shopt extglob
x="123"
if [[ "$x" == +([[:digit:]]) ]]; then
echo "[[ Ok!"
fi
case $x in
+([[:digit:]])) echo "case Ok" ;;
*) echo case "KO" ;;
esac
산출
checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
extglob off
[[ Ok!
./extglob_test.sh: line 10: syntax error near unexpected token `('
./extglob_test.sh: line 10: ` +([[:digit:]])) echo "case Ok" ;;'
이것은 나에게 몇 가지 질문을 제기했습니다.
shopt extglob
닫혀 있다고 말하면 9행의 케이스 옵션이 논리적으로 실패합니다. 그런데 코드의 5번째 줄이 왜 성공할까요?환경 변수 BASHOPTS에는 상속된 shopt 옵션이 포함되어 있으며 BASH 매뉴얼에는 다음과 같이 명시되어 있습니다.
BASHOPTS A colon-separated list of enabled shell options. Each word in the list is a valid argument for the -s option to the shopt builtin command (see SHELL BUILTIN COMMANDS below). The options appearing in BASHOPTS are those reported as on by shopt. If this variable is in the environment when bash starts up, each shell option in the list will be enabled before reading any startup files. This variable is read-only.
extglob
그래서 스크립트에서 활성화된 것을 보고 싶습니다 . 실제로echo $BASHOPTS
쉘 프롬프트에서 명령을 실행하면 다음이 출력됩니다.checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sourcepath
extglob
그러나 여기에는 있지만 스크립트 출력에는 누락된 옵션과 같은 몇 가지 차이점이 있음을 알 수 있습니다 .물론 스크립트의 3번째 줄에서 옵션을 활성화하면 다음과 같은 결과
extglob
가 나타납니다.shopt -s extglob
checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath [[ Ok! case Ok
그러나 린터(저는 Vim에서 Ale을 사용하고 있습니다)는 여전히 9행에서 구문 오류 신호를 보냅니다.
어떤 아이디어가 있나요?
답변1
질문이 3개 있습니다.
의견에서 알 수 있듯이
[[
내부 extglob은 기본적으로 활성화되어 있습니다.환경 변수 BASHOPTS가 없습니다. 달리면 아무것도 볼 수 없지만
export | grep BASHOPTS
아무것도 볼 수 없습니다. 당신이 인용한 대로 "만약에이 변수는 bash가 시작될 때 환경에 있습니다..."export BASHOPTS
대화형 쉘에서 실행해야 합니다.더 나은 린트를 얻으세요!