bash가 소스 파일의 구문 검사를 방지하는 방법은 무엇입니까?

bash가 소스 파일의 구문 검사를 방지하는 방법은 무엇입니까?

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)

답변1

Bash가 구문 검사를 수행하지 않도록 하는 대신, 올바른 쉘이 호출할 때만 이를 선택하는 스크립트를 사용하는 것은 어떨까요?

답변2

평가는 하나만 필요합니다.

[ -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/)
  '

( 이것은 Bourne 함수 구문을 지원하는 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것이 합리적 이라는 데 동의하는 경향이 있습니다 .zshzsh

관련 정보