J'avais besoin d'écrire un script pour entrer une entrée multiligne dans un programme ( psql
).
Après un peu de recherche sur Google, j'ai trouvé les travaux de syntaxe suivants:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Cela construit correctement la chaîne multiligne (de BEGIN;
à END;
, inclus) et la redirige en tant qu'entrée vers psql
.
Mais je n'ai aucune idée de comment / pourquoi cela fonctionne, quelqu'un peut-il expliquer?
Je me réfère principalement à cat << EOF
, je connais les >
sorties d'un fichier, les >>
ajoute à un fichier, <
lit les entrées du fichier.
Que fait <<
exactement?
Et y a-t-il une page de manuel pour cela?
cat
. Essayezpsql ... << EOF ...
Voir aussi "ici les chaînes". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
lit stding (lorsqu'il y est canalisé) ou lit un fichier qui correspond à ses arguments de ligne de commandeRéponses:
C'est ce qu'on appelle le format heredoc pour fournir une chaîne dans stdin. Voir https://en.wikipedia.org/wiki/Here_document#Unix_shells pour plus de détails.
De
man bash
:la source
<<-
veuillez noter que seuls les caractères de tabulation principaux sont supprimés - pas les caractères de tabulation logicielle. C'est l'un de ces rares cas où vous avez réellement besoin du caractère de tabulation. Si le reste de votre document utilise des onglets souples, assurez-vous d'afficher les caractères invisibles et (par exemple) copiez et collez un caractère de tabulation. Si vous le faites correctement, la mise en évidence de votre syntaxe devrait correctement intercepter le délimiteur de fin.La
cat <<EOF
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 d'
cat <<EOF
utilisation de la syntaxe dans Bash:1. Affectez une chaîne multiligne à une variable shell
La
$sql
variable contient désormais également les caractères de nouvelle ligne. Vous pouvez vérifier avececho -e "$sql"
.2. Passer une chaîne multi-lignes à un fichier dans Bash
Le
print.sh
fichier contient désormais:3. Passer une chaîne multi-ligne à un tuyau dans Bash
Le
b.txt
fichier contientbar
et desbaz
lignes. La même sortie est imprimée surstdout
.la source
Dans votre cas, "EOF" est appelé "Here Tag". Indique fondamentalement
<<Here
au shell que vous allez entrer une chaîne multiligne jusqu'au "tag"Here
. Vous pouvez nommer cette balise comme vous le souhaitez, c'est souventEOF
ouSTOP
.Quelques règles concernant les balises Here:
exemple:
la source
<<-
premier onglet est utilisé n'empêchera pas le tag d'être reconnuPOSIX 7
kennytm cité
man bash
, mais l'essentiel est également POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Exemples
Quelques exemples pas encore donnés.
Les citations empêchent l'expansion des paramètres
Sans citations:
Production:
Avec des citations:
ou (moche mais valide):
Les sorties:
Le tiret supprime les onglets de tête
Sans trait d'union:
où
<tab>
est un onglet littéral, et peut être inséré avecCtrl + V <tab>
Production:
Avec trait d'union:
Production:
Cela existe bien sûr pour que vous puissiez mettre en retrait votre
cat
code similaire, ce qui est plus facile à lire et à maintenir. Par exemple:Malheureusement, cela ne fonctionne pas pour les caractères d'espace: POSIX a favorisé l'
tab
indentation ici. Oui.la source
<<-
et<tab>a
, il convient de noter que le but était de permettre une indentation normale du code dans le script tout en permettant au texte hérédoc présenté au processus de réception de commencer dans la colonne 0. C'est une fonctionnalité peu courante et un peu plus de contexte peut empêcher de se gratter la tête ...$
"$a"'$b'"$c"
, mais il n'y a pas d'analogue ici AFAIK.Utiliser un tee au lieu d'un chat
Pas exactement comme réponse à la question d'origine, mais je voulais quand même la partager: j'avais besoin de créer un fichier de configuration dans un répertoire qui nécessitait des droits root.
Ce qui suit ne fonctionne pas dans ce cas:
car la redirection est gérée en dehors du contexte sudo.
J'ai fini par utiliser ceci à la place:
la source
Une petite extension des réponses ci-dessus. La fin
>
dirige l'entrée dans le fichier, écrasant le contenu existant. Cependant, une utilisation particulièrement pratique est la double flèche>>
qui s'ajoute, ajoutant votre nouveau contenu à la fin du fichier, comme dans:Cela étend votre
fstab
sans que vous ayez à vous soucier de modifier accidentellement l'un de ses contenus.la source
Ce n'est pas nécessairement une réponse à la question d'origine, mais un partage de certains résultats de mes propres tests. Cette:
produira le même fichier que:
Donc, je ne vois pas l'intérêt d'utiliser la commande cat.
la source
<<test
sanscat <<test
.Il convient de noter qu'ici, les documents fonctionnent également dans les boucles bash. Cet exemple montre comment obtenir la liste des colonnes du tableau:
ou même sans la nouvelle ligne
la source