Buscar..


Sangrando aquí documentos

Puede sangrar el texto dentro de los documentos aquí con pestañas, necesita usar el operador de redirección <<- lugar de << :

$ cat <<- EOF
    This is some content indented with tabs `\t`.
    You cannot indent with spaces you __have__ to use tabs.
    Bash will remove empty space before these lines.
    __Note__: Be sure to replace spaces with tabs when copying this example.
EOF

This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.

Un caso de uso práctico de esto (como se menciona en man bash ) está en los scripts de shell, por ejemplo:

if cond; then
    cat <<- EOF
    hello
    there
    EOF
fi

Es habitual sangrar las líneas dentro de los bloques de código como en esta declaración if , para una mejor legibilidad. Sin la sintaxis de operador <<- , nos veríamos obligados a escribir el código anterior de esta manera:

if cond; then
    cat << EOF
hello
there
EOF
fi

Eso es muy desagradable de leer y empeora mucho en un guión realista más complejo.

Aqui cuerdas

2.05b

Puedes alimentar un comando usando aquí cadenas como esta:

$ awk '{print $2}' <<< "hello world - how are you?"
world

$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she

También puede alimentar a un while de bucle con una cadena aquí:

$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello

Cadenas de límite

Un heredoc usa la cadena de límite para determinar cuándo dejar de consumir información. La cadena de límite de terminación debe

  • Estar al comienzo de una línea.
  • Sea el único texto en la línea. Nota: Si usa <<- la cadena de límite puede tener el prefijo de tabs \t

Correcto:

cat <<limitstring
line 1
line 2
limitstring

Esto dará como resultado:

line 1
line 2

Uso incorrecto:

cat <<limitstring
line 1
line 2
 limitstring

Dado que la limitstring de limitstring en la última línea no se encuentra exactamente al inicio de la línea, el shell continuará esperando más información hasta que vea una línea que comienza con la limitstring y no contiene nada más. Solo entonces dejará de esperar la entrada y procederá a pasar el documento aquí al comando cat .

Tenga en cuenta que cuando realiza el prefijo de la cadena de límite inicial con un guión, todas las pestañas al inicio de la línea se eliminan antes del análisis, por lo que los datos y la cadena de límite se pueden sangrar con pestañas (para facilitar la lectura en scripts de shell).

cat <<-limitstring
        line 1    has a tab each before the words line and has
            line 2 has two leading tabs
        limitstring

Producirá

line 1    has a tab each before the words line and has
line 2 has two leading tabs

con las pestañas iniciales (pero no las pestañas internas) eliminadas.

Crear un archivo

Un uso clásico de los documentos de aquí es crear un archivo escribiendo su contenido:

cat > fruits.txt << EOF
apple
orange
lemon
EOF

El documento aquí son las líneas entre << EOF y EOF .

Este documento aquí se convierte en la entrada del comando cat . El cat de comandos simplemente da salida a su entrada, y utilizando el operador de redirección de salida > que redirigir a un archivo fruits.txt .

Como resultado, el archivo fruits.txt contendrá las líneas:

apple
orange
lemon

Se aplican las reglas habituales de redirección de salida: si fruits.txt no existía antes, se creará. Si existió antes, será truncado.

Ejecutar comando con el documento aquí

ssh -p 21 [email protected] <<EOF
  echo 'printing pwd'
  echo "\$(pwd)"
  ls -a
  find '*.txt'
EOF

$ se escapa porque no queremos que se expanda por el shell actual, es decir, $(pwd) se ejecutará en el shell remoto.

De otra manera:

ssh -p 21 [email protected] <<'EOF'
  echo 'printing pwd'
  echo "$(pwd)"
  ls -a
  find '*.txt'
EOF    

Nota : El EOF de cierre debe estar al principio de la línea (sin espacios en blanco antes). Si se requiere sangría, se pueden usar pestañas si comienza su heredoc con <<- . Vea los ejemplos de sangría aquí y cadenas de límite para obtener más información.

Ejecuta varios comandos con sudo.

sudo -s <<EOF
  a='var'
  echo 'Running serveral commands with sudo'
  mktemp -d
  echo "\$a"
EOF
  • $a debe ser evitado para evitar que sea expandido por el shell actual

O

sudo -s <<'EOF'
  a='var'
  echo 'Running serveral commands with sudo'
  mktemp -d
  echo "$a"
EOF


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow