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かシェルがbashbashかどうか。

上記の各関数には、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

評価は1つだけ必要です。

[ -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

関連情報