899 votes

Comment puis-je écrire un doc ici dans un fichier dans un script Bash?

Comment puis-je écrire un document ici dans un fichier dans un script Bash?

1337voto

Stefan Lasiewski Points 2627

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
$

186voto

Livven Points 546

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.

74voto

TomRoche Points 182

Note:

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:

  1. Voulez-vous remplacer le fichier existant, ajouter à un fichier existant, ou d'écrire dans un nouveau fichier?
  2. Est-ce que votre utilisateur ou d'un autre utilisateur (par exemple, root) propriétaire du fichier?
  3. 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:

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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
    

20voto

Serge Stroobandt Points 525

Si les autorisations root pour le fichier de destination sont requises, utilisez |sudo tee au lieu de > :

 cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
 

16voto

Joshua Enfield Points 4288

Pour les personnes qui pourraient avoir ce problème, le format suivant a fonctionné:

 (cat <<- _EOF_
        LogFile /var/log/clamd.log
        LogTime yes
        DatabaseDirectory /var/lib/clamav
        LocalSocket /tmp/clamd.socket
        TCPAddr 127.0.0.1
        SelfCheck 1020
        ScanPDF yes
        _EOF_
) > /etc/clamd.conf
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X