Eval $ (nome file cat) è uguale al nome file sorgente?


9

Lavorando su alcune funzioni bash, non conoscevo il source ...comando, quindi ho usato eval $(cat ...)invece. Ora mi chiedo, dove dovrei cambiare ogni suo uso o è solo la stessa funzione?

Sembrano funzionare allo stesso modo ora, ma forse ci saranno alcune differenze fuorvianti in seguito, voglio solo sapere.

Risposte:


6

eval $(cat ...)non funziona in tutti i casi. Ad esempio le interruzioni di riga vengono convertite in un singolo spazio $(cat ...)prima che il contenuto venga elaborato da eval. Questo spesso interrompe le dichiarazioni a più righe come i loop e qui i documenti.

Prova ad esempio il seguente file con entrambi i metodi:

for i in 1 2 3; do
 echo $i
done

cat<<EOF
a
b
c
EOF

4
Se usi le virgolette, lo spazio bianco rimarrà intatto:eval "$(cat file)"
glenn jackman,

1
Sì, anche quello dovrebbe funzionare. Ma se si deve cambiare il codice comunque, preferisco sourceperché è un comando fatto appositamente per questo.
Florian Diesch,

9

Come già accennato da @glennjackman, ti consigliamo di citare la sostituzione del comando, altrimenti la suddivisione delle parole e l'espansione del percorso modificheranno il contenuto prima che venga valutato. E mentre entrambi eseguiranno i comandi dal file, ci sono differenze.

  • Quando si sorgente di uno script, diverse variabili speciali shell saranno modificati, principalmente BASH_SOURCE, BASH_LINENOe FUNCNAMEgli array. Questi sono utili per stampare messaggi di errore e debug.

  • È possibile tornare da uno script di origine con il returncomando ( help return). Con l'Eval non otterrai questo effetto. Allo stesso modo, una trappola di RITORNO non verrà attivata per l'eval.

  • Quando si acquista uno script, è possibile passare argomenti ad esso. Non puoi farlo con quell'eval.

  • Con eval, la sostituzione del comando leggerà l'intero contenuto del file in memoria prima di passarlo a eval. Quando lo procedi, bash leggerà dal file mentre procede.


1

C'è un bel riassunto di cosa fanno sorgente, eval ed exec qui: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html

Penso che il tuo uso di eval e il sorgente del file faranno la stessa cosa. Non sono del tutto sicuro, tuttavia, che le variabili all'interno del pedice si comporteranno uguali in ogni caso. Consiglierei di usare source se possibile, perché è il modo più semplice di procedere e rende il tuo codice più leggibile.


3
completamente tangenziale: bash ha una scorciatoia per $(cat file)->$(< file)
glenn jackman l'
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.