소스 파일의 구문 검사에서 bash를 어떻게 중지합니까?


9

zsh와 bash가 모두 제공하는 파일에 다음 코드가 있습니다.

if test $SHELLNAME = zsh ; then
    lss() { l -l ${1:-.}/*(s,S,t); }
    laf() { l ${1:-.}/.*(.); }
    lad() { l -d ${1:-.}/.*(/); }
    lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }
fi

SHELLNAMEzsh쉘이 zsh을하고있는 경우 bash쉘이 bash는 경우.

위의 각 함수에는 zsh에서는 작동하지만 bash에서는 작동하지 않는 코드가 포함되어 있습니다.

이 파일을 소싱하면 다음과 같은 오류가 발생합니다.

bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: `     lss() { l -l ${1:-.}/*(s,S,t); }'

현재 evalbash의 구문 검사를 우회 하는 데 사용 하고 있습니다.

if test $SHELLNAME = zsh ; then
    # Using eval makes sure bash can't try to syntax-check these functions.
    eval 'lss() { l -l ${1:-.}/*(s,S,t); }'
    eval 'laf() { l ${1:-.}/.*(.); }'
    eval 'lad() { l -d ${1:-.}/.*(/); }'
    eval 'lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }'
fi

이 문제에 대한 더 나은 해결책이 있습니까? (아마도 사용하지 않는 것 eval)

bash  zsh 

답변:


14

하나의 평가판 만 있으면됩니다.

[ -n "$ZSH_VERSION" ] &&
  eval '
    lss() l -l ${1:-.}/*(s,S,t)
    laf() l ${1:-.}/.*(.)
    lad() l -d ${1:-.}/.*(/)
    lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
  '

(참고 zsh반대는 bash보른 함수 구문을 지원)

또는:

[ -n "$ZSH_VERSION" ] && . /dev/fd/3 3<< '# End of zsh specific section'
  lss() l -l ${1:-.}/*(s,S,t)
  laf() l ${1:-.}/.*(.)
  lad() l -d ${1:-.}/.*(/)
  lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
# End of zsh specific section

그러나 나는 동의하는 경향이 것 slm이가 가진 zsh유일한 의해 공급 별도의 파일에서 특정 구문 zsh감각을 만들 것입니다.


8-) 단어로만 생각할 수있는 것을 코드에 넣어 주셔서 감사합니다.
slm

15

Bash가 구문 검사를하지 않도록 시도하는 대신,이 소스를 소싱하는 스크립트가 올바른 쉘에 의해 호출 될 때만 소스를 제공하는 이유는 무엇입니까?


파일은 bash와 zsh에 의해 제공됩니다. zsh 관련 부분을 자체 파일로 분할하려고 생각합니다.

6
그래, 내가하려는대로 야 앞으로 나아갈 것과 미래에 코드에 등장하는 다른 사람을 유지하고 지원하는 것이 더 명확합니다. 코드에서는 항상 영리한 것이 아니라 명시 적으로 시도합니다.
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.