Bash 스크립트에서 확장된 glob 패턴의 일관되지 않은 동작

Bash 스크립트에서 확장된 glob 패턴의 일관되지 않은 동작

다음 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" ;;'

이것은 나에게 몇 가지 질문을 제기했습니다.

  1. shopt extglob닫혀 있다고 말하면 9행의 케이스 옵션이 논리적으로 실패합니다. 그런데 코드의 5번째 줄이 왜 성공할까요?

  2. 환경 변수 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
    
  3. 그러나 린터(저는 Vim에서 Ale을 사용하고 있습니다)는 여전히 9행에서 구문 오류 신호를 보냅니다.

어떤 아이디어가 있나요?

답변1

질문이 3개 있습니다.

  1. 의견에서 알 수 있듯이 [[내부 extglob은 기본적으로 활성화되어 있습니다.

  2. 환경 변수 BASHOPTS가 없습니다. 달리면 아무것도 볼 수 없지만 export | grep BASHOPTS아무것도 볼 수 없습니다. 당신이 인용한 대로 "만약에이 변수는 bash가 시작될 때 환경에 있습니다..." export BASHOPTS대화형 쉘에서 실행해야 합니다.

  3. 더 나은 린트를 얻으세요!

관련 정보