Bash
Aquí los documentos y aquí las cadenas.
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
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