Aquí hay un ejemplo que escribirá el contenido en un archivo en /tmp/yourfilehere
cat << EOF >/tmp/yourfilehereThese contents will be written to the file.This line is indented.
EOF
Tenga en cuenta que el 'EOF' final (The LimitString) no debe tener ningún espacio en blanco delante de la palabra, porque significa que LimitStringno se reconocerá.
En un script de shell, es posible que desee utilizar la sangría para que el código sea legible, sin embargo, esto puede tener el efecto indeseable de sangrar el texto dentro de 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 necesitará reemplazar el espacio en blanco inicial con un carácter de tabulación , ya que no puedo imprimir los caracteres de tabulación reales aquí).
#!/usr/bin/env bashif true ;then
cat <<- EOF >/tmp/yourfilehereThe leading tab is ignored.
EOFfi
Si no desea interpretar variables en el texto, utilice comillas simples:
cat <<'EOF'>/tmp/yourfilehereThe variable $FOO will not be interpreted.
EOF
Para canalizar el heredoc a través de una canalización de comandos:
cat <<'EOF'| sed 's/a/b/'
foo
bar
baz
EOF
Salida:
foo
bbr
bbz
... o escribir el heredoc en un archivo usando sudo:
cat <<'EOF'| sed 's/a/b/'| sudo tee /etc/config_file.conf
foo
bar
baz
EOF
Ni siquiera necesita Bash, esta característica también se encuentra en los shells Bourne / Korn / POSIX.
Janus Troelsen
55
¿qué pasa <<<, cómo se llaman?
Jürgen Paul
18
@PineappleUndertheSea <<<se llaman 'Here Strings'. Código similar tr a-z A-Z <<< 'one two three'dará como resultado la cadena ONE TWO THREE. Más información en es.wikipedia.org/wiki/Here_document#Here_strings
Stefan Lasiewski
8
El EOF final tampoco debe tener ningún espacio en blanco después . Al menos en bash, esto hace que no sea reconocido como delimitador
carpii
10
Dado que este heredoc en particular está destinado a ser contenido literal, en lugar de contener sustituciones, debería serlo en <<'EOF'lugar de <<EOF.
Charles Duffy
153
En lugar de usar caty redireccionar E / S, podría ser útil usar teeen su lugar:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Es más conciso, además, a diferencia del operador de redireccionamiento, puede combinarse sudosi necesita escribir en archivos con permisos de root.
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 independientes principales o preguntas secundarias:
¿Desea sobrescribir un archivo existente, agregarlo a un archivo existente o escribir en un archivo nuevo?
¿Su usuario u otro usuario (p. Ej. root) Posee el archivo?
¿Desea escribir el contenido de su heredoc literalmente, o hacer que bash interprete referencias variables dentro de su heredoc?
(Hay otras dimensiones / preguntas secundarias 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úrese de que la cadena que utiliza como su identificador de delimitación no se encuentre dentro de su heredoc:
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) de su propiedad, sustituyendo las referencias de variables dentro del heredoc:
cat << EOF >/path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
Para anexar un archivo existente (o escribir en un archivo nuevo) de su propiedad, sustituyendo referencias variables dentro del heredoc:
cat << FOE >>/path/to/your/fileThis 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 del heredoc:
cat <<'END_OF_FILE'>/path/to/your/fileThis 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 del heredoc:
cat <<'eof'>>/path/to/your/fileThis 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 referencias variables dentro del heredoc:
cat << until_it_ends | sudo tee /path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
Para agregar un archivo existente (o escribir en un archivo nuevo) propiedad de user = foo, con el contenido literal del heredoc:
cat <<'Screw_you_Foo'| sudo -u foo tee -a /path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.Screw_you_Foo
# 6 es el mejor. Pero, ¿cómo sobrescribe el contenido del archivo existente con el n. ° 6?
Aleksandr Makov
2
@Aleksandr Makov: ¿cómo se sobrescribe el contenido del archivo existente con el n. ° 6? Omita el -a== --append; es decir, tee -a-> tee. Mira info tee(lo citaría aquí, pero el marcado de comentarios es demasiado limitado.
TomRoche
1
¿Hay algún beneficio para el n. ° 6 que usa gato y tuberías para el tee en lugar de sudo tee /path/to/your/file << 'Screw_you_Foo'?
codemonkee
¿Por qué en FOElugar de EOFen el ejemplo adjunto?
Becko
2
@becko: solo para ilustrar que la etiqueta es solo una etiqueta. Tenga en cuenta que usé una etiqueta diferente en cada ejemplo.
TomRoche
41
Para construir sobre la respuesta de @ Livven , aquí hay algunas combinaciones útiles.
sustitución de variables, pestaña inicial retenida, sobrescribir archivo, eco a stdout
tee /path/to/file <<EOF
${variable}
EOF
sin sustitución de variables , pestaña inicial retenida, sobrescribir archivo, eco a stdout
tee /path/to/file <<'EOF'
${variable}
EOF
sustitución de variables, pestaña inicial eliminada , sobrescribir archivo, eco a stdout
tee /path/to/file <<-EOF
${variable}
EOF
sustitución de variables, pestaña inicial retenida, agregar al archivo , eco a stdout
tee -a /path/to/file <<EOF
${variable}
EOF
sustitución de variables, pestaña inicial retenida, sobrescribir archivo, sin eco a stdout
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
lo anterior se puede combinar con sudo, así
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
No necesito los paréntesis: cat << END > afileseguido del heredoc funciona perfectamente bien.
Glenn Jackman
Gracias, esto realmente resolvió otro problema que encontré. Después de unos pocos documentos aquí hubo algunos problemas. Creo que tenía que ver con los padres, ya que con el consejo anterior lo solucionó.
Joshua Enfield
2
Esto no funcionara. La redirección de salida debe estar al final de la línea que comienza catcomo se muestra en la respuesta aceptada.
Pausado hasta nuevo aviso.
2
@DennisWilliamson Funciona, para eso están los padres. Todo se catejecuta dentro de una subshell, y toda la salida de la subshell se redirige al archivo
Izkata
2
@Izkata: Si miras el historial de edición de esta respuesta, los paréntesis se eliminaron antes de hacer mi comentario y luego se agregaron. se aplica el comentario de Glenn Jackman (y mi).
Pausado hasta nuevo aviso.
3
Como ejemplo, puedes usarlo:
Primero (haciendo 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 (ejecutar 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 (ejecutar 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 (usando 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
Respuestas:
Lea la Guía avanzada de secuencias de comandos Bash Capítulo 19. Aquí Documentos .
Aquí hay un ejemplo que escribirá el contenido en un archivo en
/tmp/yourfilehere
Tenga en cuenta que el 'EOF' final (The
LimitString
) no debe tener ningún espacio en blanco delante de la palabra, porque significa queLimitString
no se reconocerá.En un script de shell, es posible que desee utilizar la sangría para que el código sea legible, sin embargo, esto puede tener el efecto indeseable de sangrar el texto dentro de 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 necesitará reemplazar el espacio en blanco inicial con un carácter de tabulación , ya que no puedo imprimir los caracteres de tabulación reales aquí).Si no desea interpretar variables en el texto, utilice comillas simples:
Para canalizar el heredoc a través de una canalización de comandos:
Salida:
... o escribir el heredoc en un archivo usando
sudo
:fuente
<<<
, cómo se llaman?<<<
se llaman 'Here Strings'. Código similartr a-z A-Z <<< 'one two three'
dará como resultado la cadenaONE TWO THREE
. Más información en es.wikipedia.org/wiki/Here_document#Here_strings<<'EOF'
lugar de<<EOF
.En lugar de usar
cat
y redireccionar E / S, podría ser útil usartee
en su lugar:Es más conciso, además, a diferencia del operador de redireccionamiento, puede combinarse
sudo
si necesita escribir en archivos con permisos de root.fuente
> /dev/null
al final de la primera línea para evitar que el contenido del archivo here se muestre en stdout cuando se crea.sudo
, en lugar de por su brevedad :-)man tee
. Use la-a
bandera para agregar en lugar de sobrescribir.Nota:
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 independientes principales o preguntas secundarias:
root
) Posee el archivo?(Hay otras dimensiones / preguntas secundarias 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úrese de que la cadena que utiliza como su identificador de delimitación no se encuentre dentro de su heredoc:Para sobrescribir un archivo existente (o escribir en un archivo nuevo) de su propiedad, sustituyendo las referencias de variables dentro del heredoc:
Para anexar un archivo existente (o escribir en un archivo nuevo) de su propiedad, sustituyendo referencias variables dentro del heredoc:
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) que posea, con el contenido literal del heredoc:
Para agregar un archivo existente (o escribir en un archivo nuevo) que posea, con el contenido literal del heredoc:
Para sobrescribir un archivo existente (o escribir en un archivo nuevo) propiedad de root, sustituyendo referencias variables dentro del heredoc:
Para agregar un archivo existente (o escribir en un archivo nuevo) propiedad de user = foo, con el contenido literal del heredoc:
fuente
-a
==--append
; es decir,tee -a
->tee
. Mirainfo tee
(lo citaría aquí, pero el marcado de comentarios es demasiado limitado.sudo tee /path/to/your/file << 'Screw_you_Foo'
?FOE
lugar deEOF
en el ejemplo adjunto?Para construir sobre la respuesta de @ Livven , aquí hay algunas combinaciones útiles.
sustitución de variables, pestaña inicial retenida, sobrescribir archivo, eco a stdout
sin sustitución de variables , pestaña inicial retenida, sobrescribir archivo, eco a stdout
sustitución de variables, pestaña inicial eliminada , sobrescribir archivo, eco a stdout
sustitución de variables, pestaña inicial retenida, agregar al archivo , eco a stdout
sustitución de variables, pestaña inicial retenida, sobrescribir archivo, sin eco a stdout
lo anterior se puede combinar con
sudo
, asífuente
Cuando se requieren permisos de root
Cuando se requieren permisos de root para el archivo de destino, use en
|sudo tee
lugar de>
:fuente
Para las personas futuras que puedan tener este problema, el siguiente formato funcionó:
fuente
cat << END > afile
seguido del heredoc funciona perfectamente bien.cat
como se muestra en la respuesta aceptada.cat
ejecuta dentro de una subshell, y toda la salida de la subshell se redirige al archivoComo ejemplo, puedes usarlo:
Primero (haciendo conexión ssh):
Segundo (ejecutar comandos):
Tercero (ejecutar comandos):
Adelante (usando variables):
fuente
Me gusta este método de concisión, legibilidad y presentación en un guión sangrado:
¿Dónde
→
está un tabpersonaje?fuente