Le cat <<EOF
La syntaxe est très utile lorsque vous travaillez avec du texte multiligne dans Bash, par exemple. lors de l'affectation d'une chaîne multiligne à une variable shell, un fichier ou un tube.
Exemples de cat <<EOF
utilisation de la syntaxe dans Bash :
1. Affecter une chaîne multiligne à une variable shell
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
Le $sql
La variable contient désormais également les caractères de nouvelle ligne. Vous pouvez vérifier avec echo -e "$sql"
.
2. Passer une chaîne multiligne à un fichier dans Bash
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
Le print.sh
le fichier contient maintenant :
#!/bin/bash
echo $PWD
echo /home/user
3. Passer une chaîne multiligne à un tube dans Bash
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
Le b.txt
le fichier contient bar
et baz
lignes. La même sortie est imprimée sur stdout
.
Cela s'appelle heredoc format pour fournir une chaîne dans stdin. Voir https://en.wikipedia.org/wiki/Here_document#Unix_shells pour plus de détails.
À partir de man bash
:
Voici Documents
Ce type de redirection demande au shell de lire l'entrée à partir de la source actuelle jusqu'à ce qu'une ligne contenant uniquement un mot (sans espaces de fin) soit vue.
Toutes les lignes lues jusque-là sont alors utilisées comme entrée standard pour une commande.
Le format des documents ici est :
<<[-]word here-document delimiter
Aucun développement de paramètre, substitution de commande, développement arithmétique ou développement de chemin d'accès n'est effectué sur le mot . Si des caractères dans mot sont cités, ledélimiteur est le résultat de la suppression des guillemets sur mot , et les lignes dans le ici-document ne sont pas développés.Si mot n'est pas entre guillemets, toutes les lignes du document ici sont soumis à l'expansion des paramètres, à la substitution de commandes et à l'expansion arithmétique. Dans ce dernier cas, la suite de caractères
\<newline>
est ignoré, et\
doit être utilisé pour citer les caractères\
,$
, et`
.Si l'opérateur de redirection est
<<-
, alors tous les caractères de tabulation de tête sont supprimés des lignes d'entrée et de la ligne contenant le délimiteur . Cela permet aux documents ici dans les scripts shell d'être indentés de manière naturelle.
Dans votre cas, "EOF" est connu sous le nom de "Here Tag". En gros <<Here
indique au shell que vous allez saisir une chaîne multiligne jusqu'à la "balise" Here
. Vous pouvez nommer ce tag comme vous voulez, c'est souvent EOF
ou STOP
.
Quelques règles concernant les balises Here :
- La balise peut être n'importe quelle chaîne, majuscule ou minuscule, bien que la plupart des gens utilisent les majuscules par convention.
- La balise ne sera pas considérée comme une balise Here s'il y a d'autres mots dans cette ligne. Dans ce cas, il sera simplement considéré comme faisant partie de la chaîne. Le tag doit figurer seul sur une ligne distincte pour être considéré comme un tag.
- La balise ne doit comporter aucun espace de début ou de fin sur cette ligne pour être considérée comme une balise. Sinon, il sera considéré comme faisant partie de la chaîne.
exemple :
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string