J'avais besoin d'écrire un script pour entrer une entrée multi-ligne dans un programme (psql
).
Après un peu de recherche sur Google, j'ai trouvé que la syntaxe suivante fonctionne :
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Cela construit correctement la chaîne multi-ligne (de BEGIN;
à END;
, inclusivement) et la passe en tant qu'entrée à psql
.
Mais je n'ai aucune idée de comment/pourquoi cela fonctionne, quelqu'un pourrait-il s'il vous plaît expliquer?
Je fais principalement référence à cat << EOF
, je sais que >
écrit dans un fichier, >>
ajoute à un fichier, <
lit une entrée depuis un fichier.
Que fait exactement <<
?
Et y a-t-il une page de manuel à ce sujet?
34 votes
C'est probablement une utilisation inutile de
cat
. Essayezpsql ... << EOF ...
Voir aussi "here strings". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Strings1 votes
Je suis surpris que cela fonctionne avec cat mais pas avec echo. cat devrait s'attendre à un nom de fichier en tant que stdin, pas une chaîne de caractères. psql << EOF semble logique, mais pas autrement. Fonctionne avec cat mais pas avec echo. Comportement étrange. Une idée à ce sujet ?
0 votes
En me répondant : chat sans paramètres exécute et réplique en sortie tout ce qui est envoyé via l'entrée (stdin), utilisant ainsi sa sortie pour remplir le fichier via >. En fait, un nom de fichier lu comme un paramètre n'est pas un flux stdin.
0 votes
@Alex echo imprime simplement ses arguments de ligne de commande tandis que
cat
lit l'entrée standard (lorsqu'elle est dirigée vers lui) ou lit un fichier qui correspond à ses arguments de ligne de commande