linux - programa - ¿Cómo puedo escribir un heredoc a un archivo en el script Bash?
scripts bash ejemplos (7)
¿Cómo puedo escribir un documento aquí en un archivo en Bash script?
Cuando se requieren permisos de root
Cuando se requieren permisos de root para el archivo de destino, use |sudo tee
lugar de >
:
cat << ''EOF'' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Como ejemplo podrías usarlo:
Primero (haciendo la conexión 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
Segundo (ejecutando comandos):
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
Tercero (ejecutando comandos):
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
Adelante (utilizando 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
En lugar de usar cat
y la redirección de E / S, puede ser útil usar tee
lugar:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Es más conciso y, a diferencia del operador de redireccionamiento, se puede combinar con sudo
si necesita escribir en archivos con permisos de root.
Lea el Capítulo 19 de la Guía avanzada de Bash-Scripting, aquí Documentos .
Aquí hay un ejemplo que escribirá el contenido en un archivo en /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Tenga en cuenta que el ''EOF'' (The LimitString
) LimitString
no debe tener ningún espacio en blanco delante de la palabra, porque significa que no se reconocerá el LimitString
.
En un script de shell, es posible que desee utilizar la sangría para hacer que el código sea legible, sin embargo, esto puede tener el efecto no deseado de sangrar el texto en su documento aquí. En este caso, use <<-
(seguido de un guión) para deshabilitar las pestañas iniciales (tenga en cuenta que para probar esto deberá reemplazar los espacios en blanco iniciales con un carácter de pestaña , ya que aquí no puedo imprimir los caracteres de las pestañas reales).
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Si no desea interpretar variables en el texto, use comillas simples:
cat << ''EOF'' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Para canalizar el heredoc a través de una tubería de comando:
cat <<''EOF'' | sed ''s/a/b/''
foo
bar
baz
EOF
Salida:
foo
bbr
bbz
... o para escribir el heredoc en un archivo usando sudo
:
cat <<''EOF'' | sed ''s/a/b/'' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
Para aprovechar la answer de @Livven, aquí hay algunas combinaciones útiles.
sustitución de variables, pestaña inicial retenida, sobrescribir archivo, echo a stdout
tee /path/to/file <<EOF ${variable} EOF
sin sustitución de variables , pestaña inicial retenida, sobrescribir archivo, echo a stdout
tee /path/to/file <<''EOF'' ${variable} EOF
sustitución de variables, pestaña inicial eliminada , sobrescribir archivo, echo a stdout
tee /path/to/file <<-EOF ${variable} EOF
sustitución de variables, pestaña inicial retenida, adjuntar a archivo , echo a stdout
tee -a /path/to/file <<EOF ${variable} EOF
sustitución de variables, pestaña inicial retenida, sobrescritura de archivos, sin eco a la salida estándar
tee /path/to/file <<EOF >/dev/null ${variable} EOF
Lo anterior se puede combinar con
sudo
también.sudo -u USER tee /path/to/file <<EOF ${variable} EOF
Para las futuras personas que puedan tener este problema, funcionó el siguiente formato:
(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
Nota:
- lo siguiente condensa y organiza otras respuestas en este hilo, especialmente el excelente trabajo de y Serge Stroobandt
- Lasiewski y yo recomendamos el Ch 19 (Aquí documentos) en la Guía avanzada de Bash-Scripting
La pregunta (¿cómo escribir un documento aquí (también conocido como heredoc ) en un archivo en un script bash?) Tiene (al menos) 3 dimensiones o subpreguntas independientes principales:
- ¿Desea sobrescribir un archivo existente, agregarlo a un archivo existente o escribir en un archivo nuevo?
- ¿Su usuario u otro usuario (por ejemplo, la
root
) es el propietario del archivo? - ¿Desea escribir los contenidos de su heredoc literalmente, o hacer que bash interprete las referencias de variables dentro de su heredoc?
(Hay otras dimensiones / subconsultas que no considero importantes. ¡Considere editar esta respuesta para agregarlas!) Estas son algunas de las combinaciones más importantes de las dimensiones de la pregunta enumerada anteriormente, con varios identificadores de delimitación diferentes: no hay nada. sagrado acerca de EOF
, solo asegúrate de que la cadena que usas como tu identificador delimitador no aparezca dentro de tu heredoc:
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) que posea, sustituyendo las referencias de variables dentro de 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
Para agregar un archivo existente (o escribir en un archivo nuevo) que posea, sustituyendo las referencias de variables dentro de 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
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) que posea, con el contenido literal de 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
Para agregar un archivo existente (o escribir en un archivo nuevo) que posea, con el contenido literal de 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
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) propiedad de root, sustituyendo las referencias de variables dentro de 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
Para adjuntar un archivo existente (o escribir en un archivo nuevo) propiedad del usuario = foo, con el contenido literal de 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