Come posso impedire a bash di controllare la sintassi dei file di provenienza?


9

Ho il seguente codice in un file che proviene da entrambi zsh e 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è zshse la shell è zsh e bashse la shell è bash.

Ognuna delle funzioni sopra contiene codice che funziona con zsh, ma non bash.

Quando provo questo file, ricevo i seguenti errori.

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

Al momento, sto usando evalper bypassare il controllo della sintassi di 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

C'è una soluzione migliore a questo problema? (forse uno che non usa eval)

bash  zsh 

Risposte:


14

Hai solo bisogno di una valutazione.

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

(nota che zshcontrariamente a bashsupporta la sintassi della funzione Bourne)

O:

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

Ma tenderei a concordare sul fatto slmche avere senso la zshsintassi specifica in un file separato solo di provenienza zshavrebbe senso.


Grazie per aver inserito nel codice ciò a cui potevo solo pensare a parole Cool.
slm

15

Invece di provare a fare in modo che Bash non verifichi la sintassi, perché non avere il tuo script che sta facendo il sourcing di questa fonte solo quando viene chiamato dalla shell corretta.


Il file proviene da entrambi bash e zsh. Sto pensando di dividere le parti specifiche di zsh nel loro file.

6
Sì, è esattamente quello che vorrei fare. È più chiaro mantenere e supportare te stesso lungo la strada e per chiunque venga nel codice in futuro. Nel codice cerco sempre di esplicito piuttosto che intelligente.
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.