Comment puis-je écrire un document ici dans un fichier dans un script Bash?
Réponses
Trop de publicités?Lire l'Advanced Bash Scripting Guide Chapitre 19. Ici Des Documents.
Voici un exemple qui va écrire le contenu d'un fichier à l' /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is not indented.
EOF
Notez que la finale de "EOF' ( LimitString
) ne devrait pas avoir n'importe quel espace en face de la parole, car il signifie que l' LimitString
ne sera pas reconnu.
Dans un script shell, vous pouvez utiliser l'indentation pour rendre le code lisible, cependant, cela peut avoir l'effet indésirable de la mise en retrait du texte dans votre document ici. Dans ce cas, utiliser des <<-
(suivi d'un tiret) pour désactiver les principaux onglets (Note que pour tester cela, vous aurez besoin de remplacer le premier espace avec un caractère de tabulation, puisque je ne peux pas imprimer réelle des caractères de tabulation ici.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Si vous ne voulez pas d'interpréter les variables dans le texte, puis utilisez les guillemets simples:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
À la pipe la heredoc à travers un pipeline de la commande
$ cat <<'EOF' | sed 's/a/b/'
> foo
> bar
> baz
> EOF
foo
bbr
bbz
$
Au lieu d'utiliser cat
et la redirection d'E / S, il peut être utile d'utiliser tee
place:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Il est plus concis, et contrairement à l'opérateur de redirection, il peut être combiné avec sudo
si vous avez besoin d'écrire dans des fichiers avec des permissions root.
Note:
- la suite se condense et organise d'autres réponses dans ce thread, esp l'excellent travail de Stefan Lasiewski et Serge Stroobandt
- Lasiewski et je recommande Ch 19 (Ici des Documents) dans le Advanced Bash Scripting Guide
La question (comment écrire un document ici (aka heredoc) d'un fichier dans un script bash?) a (au moins) 3 principaux aspects indépendants ou subquestions:
- Voulez-vous remplacer le fichier existant, ajouter à un fichier existant, ou d'écrire dans un nouveau fichier?
- Est-ce que votre utilisateur ou d'un autre utilisateur (par exemple,
root
) propriétaire du fichier? - Voulez-vous écrire le contenu de votre heredoc littéralement, ou d'avoir bash interpréter les références à des variables à l'intérieur de votre heredoc?
(Il existe d'autres dimensions/subquestions qui je ne considère pas l'important. Envisager la modification de cette réponse pour les ajouter!) Voici quelques-uns des plus importants combinaisons des dimensions de la question dans la liste ci-dessus, avec les différentes identificateurs de délimitation--il n'y a rien de sacré EOF
, assurez-vous que la chaîne de caractères que vous utilisez comme votre délimitant un identificateur ne pas se produire à l'intérieur de votre heredoc:
-
Pour remplacer un fichier existant (ou d'écrire dans un nouveau fichier) que vous possédez, en remplaçant les références à des variables à l'intérieur de la heredoc:
cat << EOF > /path/to/your/file This line will write to the file. ${THIS} will also write to the file, with the variable contents substituted. EOF
-
Pour ajouter un fichier existant (ou d'écrire dans un nouveau fichier) que vous possédez, en remplaçant les références à des variables à l'intérieur de la heredoc:
cat << FOE >> /path/to/your/file This line will write to the file. ${THIS} will also write to the file, with the variable contents substituted. FOE
-
Pour remplacer un fichier existant (ou d'écrire dans un nouveau fichier) que vous possédez, avec le contenu littéral de la heredoc:
cat << 'END_OF_FILE' > /path/to/your/file This line will write to the file. ${THIS} will also write to the file, without the variable contents substituted. END_OF_FILE
-
Pour ajouter un fichier existant (ou d'écrire dans un nouveau fichier) que vous possédez, avec le contenu littéral de la heredoc:
cat << 'eof' >> /path/to/your/file This line will write to the file. ${THIS} will also write to the file, without the variable contents substituted. eof
-
Pour remplacer un fichier existant (ou d'écrire dans un nouveau fichier) propriété de root, en remplaçant les références à des variables à l'intérieur de la heredoc:
cat << until_it_ends | sudo tee /path/to/your/file This line will write to the file. ${THIS} will also write to the file, with the variable contents substituted. until_it_ends
-
Pour ajouter un fichier existant (ou d'écrire dans un nouveau fichier) la propriété de l'utilisateur=foo, avec le contenu littéral de la heredoc:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file This line will write to the file. ${THIS} will also write to the file, without the variable contents substituted. Screw_you_Foo