Wie kann ich verhindern, dass Bash Syntaxdateien mit Syntax überprüft?

9

Ich habe den folgenden Code in einer Datei, die sowohl von zsh als auch von bash stammt.

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

SHELLNAMEist, zshwenn die Shell zsh ist und bashwenn die Shell bash ist.

Jede der oben genannten Funktionen enthält Code, der mit zsh funktioniert, jedoch nicht mit bash.

Wenn ich diese Datei beschaffe, erhalte ich die folgenden Fehler.

bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: `     lss() { l -l ${1:-.}/*(s,S,t); }'

Im Moment verwende ich eval, um die Syntaxprüfung von bash zu umgehen.

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

Gibt es eine bessere Lösung für dieses Problem? (vielleicht eine, die nicht verwendet eval)


quelle

Antworten:

14

Sie brauchen nur eine Bewertung.

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

(Beachten Sie, dass im zshGegensatz zu bashunterstützt die Bourne-Funktionssyntax)

Oder:

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

Aber ich würde eher zustimmen, slmdass es Sinn macht , die zshspezifische Syntax in einer separaten Datei zu haben, die nur von bezogen wird zsh.

Stéphane Chazelas
quelle
Vielen Dank, dass Sie Code eingegeben haben, an den ich nur in den Worten 8-) denken konnte.
slm
15

Anstatt zu versuchen, Bash dazu zu bringen, die Syntax nicht zu überprüfen, sollten Sie Ihr Skript, das die Beschaffung dieser Quelle übernimmt, nur dann verwenden, wenn es von der richtigen Shell aufgerufen wird.

slm
quelle
Die Datei wird sowohl von bash als auch von zsh bezogen. Ich denke jedoch darüber nach, die zsh-spezifischen Teile in ihre eigene Datei aufzuteilen.
6
Ja, genau das würde ich tun. Es ist klarer, sich selbst und alle anderen, die in Zukunft in den Code aufgenommen werden, zu pflegen und zu unterstützen. Im Code versuche ich immer eher explizit als klug.
slm