Come capire il comando "cat> nome_file << blah"?


13

Nel seguente comando cat prende il contenuto di here-doc e lo reindirizza al file chiamato conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Come capire l'ordine dei comandi qui? Fa bashprimi processi tutto il resto (qui-doc parte) e come passo finale, sembra la > confparte?

Risposte:


17

Here-Document è una sorta di reindirizzamento della shell, quindi la shell lo eseguirà come reindirizzamento normale, dall'inizio alla fine (o da sinistra a destra, o ordine di apparizione). Questo è definito da POSIX:

Se viene specificato più di un operatore di reindirizzamento con un comando, l'ordine di valutazione va dall'inizio alla fine.


Nel tuo comando, cateseguirà > confprima di tutto, aprendo e troncando il conffile per la scrittura, quindi leggendo i dati Here-Document.

Utilizzando strace, è possibile verificarlo:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

Vedo. Quindi, in pratica, ciò che accade in caso cat > file_name << blahè che prima di eseguire catlo stdout della shell sia collegato al file denominato file_namee quindi lo stdin della shell sia collegato qui-doc ?
Martin,

@Martin: Sì. Si può vedere è openstato chiamato prima dup2.
cuonglm,

12

Bene, scopriamo:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Immagino che prima debba fare la >"$file"parte prima. E se ...

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...nessun errore...?

cat ./myfile

this is in ./myfile

A quanto pare, l'ordine conta.


-1

Quando bashcrea il processo da eseguire cat, si apre confper la scrittura sul descrittore di file 1 e apre un file temporaneo (per il documento qui) per la lettura sul descrittore di file 0, prima di execavviare il programma. In questo caso, non importa in quale ordine avvengano tali azioni.

L'ordine diventa significativo quando vengono riassegnati i descrittori di file, ad esempio con 2>&1.

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.