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); }'
現在私はeval
bashの構文チェックをバイパスするためにこれを使用しています。
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
合理的であることに同意する傾向があります。zsh
zsh