Comment comprendre la commande "cat> file_name << blah"?


13

Dans la commande suivante, cat prend le contenu de here-doc et le redirige vers le fichier nommé conf:

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

Comment comprendre l'ordre des commandes ici? Est- bashce que tout d'abord traite tout le reste (partie ici-doc) et comme étape finale il regarde la > confpartie?

Réponses:


17

Here-Document est une sorte de redirection de shell, donc le shell l'exécutera comme une redirection normale, du début à la fin (ou de gauche à droite, ou l'ordre d'apparition). Ceci est défini par POSIX:

Si plusieurs opérateurs de redirection sont spécifiés avec une commande, l'ordre d'évaluation est du début à la fin.


Dans votre commande, catexécutera d' > confabord, ouvrir et tronquer le conffichier pour l'écriture, puis lire les données de Here-Document.

En utilisant strace, vous pouvez le vérifier:

$ 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
...

Je vois. Donc, fondamentalement, ce qui se passe en cas de, cat > file_name << blahc'est qu'avant l'exécution, catla sortie standard du shell est connectée au fichier nommé file_name, puis stdin du shell est connecté à here-doc ?
Martin

@Martin: Oui. Vous pouvez voir a openété appelé avant dup2.
cuonglm

12

Eh bien, découvrons:

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

bash: : No such file or directory

Dang. Je suppose que ça doit être la >"$file"première partie alors. Mais si...?

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

...pas d'erreur...?

cat ./myfile

this is in ./myfile

Il semble que l'ordre soit important.


-1

Lorsque bashcrée le processus à exécuter cat, il s'ouvre confpour l'écriture sur le descripteur de fichier 1 et ouvre un fichier temporaire (pour le document ici) pour la lecture sur le descripteur de fichier 0, avant de execlancer le programme. Dans ce cas, peu importe l'ordre dans lequel ces actions se produisent.

L'ordre devient significatif lorsque les descripteurs de fichiers sont réaffectés, par exemple avec 2>&1.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.