Androide

Bash heredoc

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

Tabla de contenido:

Anonim

Al escribir scripts de shell, puede encontrarse en una situación en la que necesita pasar un bloque de texto o código multilínea a un comando interactivo, como tee , cat o sftp .

En Bash y otros shells como Zsh, un documento Here (Heredoc) es un tipo de redirección que le permite pasar múltiples líneas de entrada a un comando.

La sintaxis de escribir HereDoc toma la siguiente forma:

<< 'DELIMITER' HERE-DOCUMENT DELIMITER

  • La primera línea comienza con un comando opcional seguido por el operador especial de redirección << y el identificador de delimitación.
    • Puede usar cualquier cadena como un identificador delimitador, los más utilizados son EOF o END. Si el identificador delimitador no está entre comillas, el shell sustituirá todas las variables, comandos y caracteres especiales antes de pasar las líneas del documento al comando. El signo menos para el operador de redirección <<- , hará que se ignoren todos los caracteres de tabulación iniciales. Esto le permite usar sangría al escribir documentos aquí en scripts de shell. Los caracteres de espacio en blanco iniciales no están permitidos, solo tabulación.
    El bloque de documento aquí puede contener cadenas, variables, comandos y cualquier otro tipo de entrada. La última línea termina con el identificador delimitador. No se permite el espacio en blanco frente al delimitador.

Ejemplos básicos de Heredoc

En esta sección, veremos algunos ejemplos básicos de cómo usar heredoc.

Heredoc se usa con mayor frecuencia en combinación con el comando cat.

En el siguiente ejemplo, estamos pasando dos líneas de texto que contienen una variable de entorno y un comando a cat usando un documento here.

cat << EOF The current working directory is: $PWD You are logged in as: $(whoami) EOF

Como puede ver en la salida a continuación, se sustituyen tanto la variable como la salida del comando:

The current working directory is: /home/linuxize You are logged in as: linuxize

Veamos qué sucederá si encerramos el delimitador entre comillas simples o dobles.

cat <<- "EOF" The current working directory is: $PWD You are logged in as: $(whoami) EOF

Puede observar que cuando se cita el delimitador, el shell no realiza la expansión de parámetros y la sustitución de comandos.

The current working directory is: $PWD You are logged in as: $(whoami)

if true; then cat <<- EOF Line with a leading tab. EOF fi

Line with a leading tab.

En lugar de mostrar el resultado en la pantalla, puede redirigirlo a un archivo utilizando los operadores > , >> .

cat << EOF > file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF

Si el archivo.txt no existe, se creará. Al usar > el archivo se sobrescribirá, mientras que >> agregará la salida al archivo.

La entrada heredoc también se puede canalizar. En el siguiente ejemplo, el comando sed reemplazará todas las instancias del carácter l con e :

cat <<'EOF' | sed 's/l/e/g' Hello World EOF

Heeeo Wored

Para escribir los datos canalizados en un archivo:

cat <<'EOF' | sed 's/l/e/g' > file.txt Hello World EOF

Usando Heredoc con SSH

Usar Heredoc es una de las formas más cómodas y fáciles de ejecutar múltiples comandos en un sistema remoto a través de SSH.

Cuando utilice un delimitador sin comillas, asegúrese de escapar de todas las variables, comandos y caracteres especiales; de lo contrario, se interpolarán localmente:

ssh -T [email protected] << EOF echo "The current local working directory is: $PWD" echo "The current remote working directory is: \$PWD" EOF

The current local working directory is: /home/linuxize The current remote working directory is: /home/user

También es posible que desee configurar una autenticación basada en claves SSH y conectarse a sus servidores Linux sin ingresar una contraseña.

Conclusión

En esta guía, ha aprendido qué es heredoc y cómo usarlo en sus scripts de shell.

terminal de bash