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?

Martin
la source

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
...
cuonglm
la source
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.

mikeserv
la source
-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.

Toby Speight
la source