¿Cómo puedo escribir un documento aquí en un archivo en script Bash?
¿Cómo puedo escribir un documento aquí en un archivo en script Bash?
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
cat << EOF > /tmp/yourfilehere
These 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 LimitString
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í).
#!/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, utilice comillas simples:
cat << 'EOF' > /tmp/yourfilehere
The 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
<<<
, cómo se llaman?
<<<
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
<<'EOF'
lugar de <<EOF
.
En lugar de usar cat
y redireccionar E / S, podría ser útil usar tee
en 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 sudo
si necesita escribir en archivos con permisos de root.
> /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:
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 anexar un archivo existente (o escribir en un archivo nuevo) de su propiedad, sustituyendo referencias variables dentro del 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 del 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 del 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 referencias variables dentro del 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 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/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
; es decir, tee -a
-> tee
. Mira info tee
(lo citaría aquí, pero el marcado de comentarios es demasiado limitado.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
lugar de EOF
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
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
Cuando se requieren permisos de root para el archivo de destino, use en |sudo tee
lugar de >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Para las personas futuras que puedan tener este problema, el siguiente formato funcionó:
(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
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 archivo
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