scripts script programa paso hacer español ejemplos ejecutar desde como comandos linux bash shell heredoc

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.

  1. sustitución de variables, pestaña inicial retenida, sobrescribir archivo, echo a stdout

    tee /path/to/file <<EOF ${variable} EOF

  2. sin sustitución de variables , pestaña inicial retenida, sobrescribir archivo, echo a stdout

    tee /path/to/file <<''EOF'' ${variable} EOF

  3. sustitución de variables, pestaña inicial eliminada , sobrescribir archivo, echo a stdout

    tee /path/to/file <<-EOF ${variable} EOF

  4. sustitución de variables, pestaña inicial retenida, adjuntar a archivo , echo a stdout

    tee -a /path/to/file <<EOF ${variable} EOF

  5. 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

  6. 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:

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:

  1. ¿Desea sobrescribir un archivo existente, agregarlo a un archivo existente o escribir en un archivo nuevo?
  2. ¿Su usuario u otro usuario (por ejemplo, la root ) es el propietario del archivo?
  3. ¿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:

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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