Mam następujący kod w pliku pozyskiwanym zarówno przez Zsh, jak i 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
jest, zsh
jeśli powłoka jest zsh i bash
jeśli powłoka jest bash.
Każda z powyższych funkcji zawiera kod, który działa z zsh, ale nie bash.
Gdy źródło tego pliku, otrzymuję następujące błędy.
bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: ` lss() { l -l ${1:-.}/*(s,S,t); }'
W tej chwili używam eval
do ominięcia sprawdzania składni basha.
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
Czy istnieje lepsze rozwiązanie tego problemu? (być może taki, który nie używa eval
)
Zamiast próbować sprawić, aby Bash nie sprawdzał składni, dlaczego nie ma skryptu, który korzysta z tego źródła tylko wtedy, gdy jest wywoływany przez poprawną powłokę.
źródło