Comment puis-je écrire un document ici dans un fichier en script Bash?
Comment puis-je écrire un document ici dans un fichier en script Bash?
Réponses:
Lisez le Guide de Bash-Scripting Avancé Chapitre 19. Ici Documents .
Voici un exemple qui va écrire le contenu dans un fichier à /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Notez que le 'EOF' final (Le LimitString
) ne doit pas avoir d'espace devant le mot, car cela signifie que le LimitString
ne sera pas reconnu.
Dans un script shell, vous souhaiterez peut-être utiliser l'indentation pour rendre le code lisible, mais cela peut avoir l'effet indésirable d'indenter le texte dans votre document ici. Dans ce cas, utilisez <<-
(suivi d'un tiret) pour désactiver les tabulations de début ( Notez que pour tester cela, vous devrez remplacer le blanc de début par un caractère de tabulation , car je ne peux pas imprimer les vrais 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 interpréter les variables dans le texte, utilisez des guillemets simples:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Pour diriger l'hérédoc via un pipeline de commande:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Production:
foo
bbr
bbz
... ou pour écrire l'hérédoc dans un fichier en utilisant sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, comment s'appellent-ils?
<<<
sont appelés «Here Strings». Un code comme tr a-z A-Z <<< 'one two three'
entraînera la chaîne ONE TWO THREE
. Plus d'informations sur en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
plutôt que <<EOF
.
Au lieu d'utiliser la cat
redirection d'E / S, il peut être utile d'utiliser à la tee
place:
tee newfile <<EOF
line 1
line 2
line 3
EOF
C'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 autorisations root.
> /dev/null
à la fin de la première ligne pour éviter que le contenu du fichier here ne s'affiche sur stdout lors de sa création.
sudo
, plutôt qu'en raison de sa brièveté :-)
man tee
. Utilisez l' -a
indicateur pour ajouter au lieu d'écraser.
Remarque:
La question (comment écrire un document ici (aka heredoc ) dans un fichier dans un script bash?) A (au moins) 3 dimensions ou sous-questions indépendantes principales:
root
) est-il propriétaire du fichier?(Il existe d'autres dimensions / sous-questions que je ne considère pas importantes. Envisagez de modifier cette réponse pour les ajouter!) Voici quelques-unes des combinaisons les plus importantes des dimensions de la question ci-dessus, avec différents identificateurs de délimitation différents - il n'y a rien sacré EOF
, assurez-vous simplement que la chaîne que vous utilisez comme identifiant de délimitation ne se trouve pas dans votre hérédoc:
Pour remplacer un fichier existant (ou écrire dans un nouveau fichier) que vous possédez, en remplaçant les références de variables à l'intérieur de l'hérédoc:
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 écrire dans un nouveau fichier) que vous possédez, en remplaçant les références de variables dans l'hérédoc:
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 écrire dans un nouveau fichier) que vous possédez, avec le contenu littéral de l'hérédoc:
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 écrire dans un nouveau fichier) que vous possédez, avec le contenu littéral de l'hérédoc:
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 écrire dans un nouveau fichier) appartenant à root, en remplaçant les références de variables à l'intérieur de l'hérédoc:
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 écrire dans un nouveau fichier) appartenant à user = foo, avec le contenu littéral du 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
-a
== --append
; c'est-à-dire tee -a
-> tee
. Voir info tee
(je le cite ici, mais le balisage des commentaires est trop limité.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
au lieu de EOF
dans l'exemple annexé?
Pour tirer parti de la réponse de @ Livven , voici quelques combinaisons utiles.
substitution de variable, onglet de tête conservé, écraser le fichier, écho à stdout
tee /path/to/file <<EOF
${variable}
EOF
pas de substitution de variable , onglet de tête conservé, écraser le fichier, écho à stdout
tee /path/to/file <<'EOF'
${variable}
EOF
substitution de variable, onglet de tête supprimé , écraser le fichier, écho à stdout
tee /path/to/file <<-EOF
${variable}
EOF
substitution de variable, onglet de tête conservé, ajout au fichier , écho à la sortie standard
tee -a /path/to/file <<EOF
${variable}
EOF
substitution de variable, onglet de tête conservé, écraser le fichier, pas d'écho à la sortie standard
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
ci - dessus peuvent être combinés avec sudo
aussi bien
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Lorsque les autorisations root sont requises pour le fichier de destination, utilisez à la |sudo tee
place de >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Pour les personnes futures 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
cat << END > afile
suivi de l'hérédoc, il fonctionne parfaitement bien.
cat
comme indiqué dans la réponse acceptée.
cat
s'exécute à l'intérieur d'un sous-shell, et toute la sortie du sous-shell est redirigée vers le fichier
Par exemple, vous pouvez l'utiliser:
Premièrement (connexion ssh):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
Deuxième (exécution des commandes):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Troisième (exécution des commandes):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
Quatrième (en utilisant des variables):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE