ソースファイルの構文チェックで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

SHELLNAMEあるzshシェルは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

必要な評価は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/)
  '

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

しかしslmzsh特定の構文が別のファイルに含まれているのzshは、それだけがソースであることは理にかなっていることに同意する傾向があります。


私が言葉でしか考えられないことをコードに入れてくれてありがとう8-)
slm

15

構文チェックを行わないようにBashを取得するのではなく、正しいシェルによって呼び出されているときに、このソースのみをソースとしているスクリプトを使用しないでください。


ファイルのソースはbashとzshの両方です。ただし、zsh固有の部分を独自のファイルに分割することを考えています。

6
ええ、それはまさに私がすることです。自分自身と将来のコードに参加する他の人のために、保守とサポートを行うことがより明確になります。コードでは、私は常に賢いというよりは明示的なことを心がけています。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.