Necesitaba escribir un script para ingresar entradas de varias líneas a un programa ( psql
).
Después de buscar un poco en Google, encontré que la siguiente sintaxis funciona:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Esto construye correctamente la cadena de varias líneas (desde BEGIN;
hasta END;
, inclusive) y la canaliza como entrada para psql
.
Pero no tengo idea de cómo / por qué funciona, ¿alguien puede explicarlo?
Me refiero principalmente a cat << EOF
, sé >
salidas a un archivo, se >>
agrega a un archivo, <
lee la entrada del archivo.
¿Qué hace <<
exactamente?
¿Y hay una página de manual para ello?
cat
. Intentapsql ... << EOF ...
ver también "cadenas aquí". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
lee stding (cuando se canaliza a él) o lee un archivo que corresponde a sus argumentos de la línea de comandosRespuestas:
Esto se llama formato heredoc para proporcionar una cadena en stdin. Ver https://en.wikipedia.org/wiki/Here_document#Unix_shells para más detalles.
De
man bash
:fuente
<<-
tenga en cuenta que solo se eliminan los caracteres de tabulación iniciales, no los caracteres de tabulación suave. Este es uno de esos casos raros cuando realmente necesita el carácter de tabulación. Si el resto de su documento usa pestañas suaves, asegúrese de mostrar caracteres invisibles y (por ejemplo) copie y pegue un carácter de pestaña. Si lo hace bien, su resaltado de sintaxis debería captar correctamente el delimitador final.La
cat <<EOF
sintaxis es muy útil cuando se trabaja con texto de varias líneas en Bash, por ejemplo. al asignar cadenas de varias líneas a una variable de shell, archivo o tubería.Ejemplos de
cat <<EOF
uso de sintaxis en Bash:1. Asigne una cadena de varias líneas a una variable de shell
La
$sql
variable ahora también contiene los caracteres de nueva línea. Puedes verificar conecho -e "$sql"
.2. Pase una cadena de varias líneas a un archivo en Bash
El
print.sh
archivo ahora contiene:3. Pase una cadena de varias líneas a una tubería en Bash
El
b.txt
archivo contienebar
ybaz
líneas. Se imprime la misma salidastdout
.fuente
En su caso, "EOF" se conoce como "Etiqueta aquí". Básicamente
<<Here
le dice al shell que vas a ingresar una cadena multilínea hasta la "etiqueta"Here
. Puede nombrar esta etiqueta como desee, a menudoEOF
oSTOP
.Algunas reglas sobre las etiquetas Aquí:
ejemplo:
fuente
<<-
se usa la pestaña inicial no evitará que se reconozca la etiquetaPOSIX 7
kennytm citado
man bash
, pero la mayor parte de eso también es POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Ejemplos
Algunos ejemplos aún no se dan.
Las cotizaciones evitan la expansión de parámetros
Sin comillas:
Salida:
Con comillas:
o (feo pero válido):
Salidas:
El guión elimina las pestañas iniciales
Sin guión:
donde
<tab>
es una pestaña literal y se puede insertar conCtrl + V <tab>
Salida:
Con guión:
Salida:
Esto existe, por supuesto, para que pueda sangrar
cat
el código que lo rodea, que es más fácil de leer y mantener. P.ej:Desafortunadamente, esto no funciona para los caracteres de espacio: POSIX favoreció la
tab
sangría aquí. Yikesfuente
<<-
y<tab>a
, debe tenerse en cuenta que el propósito era permitir la sangría normal del código dentro del script al tiempo que permite que el texto heredoc presentado al proceso de recepción comience en la columna 0. Es una característica poco común y un poco más contexto puede evitar una gran cantidad de rascarse la cabeza ...$
"$a"'$b'"$c"
, pero no hay un análogo aquí AFAIK.Usando tee en lugar de gato
No exactamente como respuesta a la pregunta original, pero quería compartir esto de todos modos: tuve la necesidad de crear un archivo de configuración en un directorio que requería derechos de root.
Lo siguiente no funciona para ese caso:
porque la redirección se maneja fuera del contexto sudo.
Terminé usando esto en su lugar:
fuente
Una pequeña extensión a las respuestas anteriores. El seguimiento
>
dirige la entrada al archivo, sobrescribiendo el contenido existente. Sin embargo, un uso particularmente conveniente es la flecha doble>>
que se agrega, agregando su nuevo contenido al final del archivo, como en:Esto extiende su
fstab
sin tener que preocuparse por modificar accidentalmente ninguno de sus contenidos.fuente
Esto no es necesariamente una respuesta a la pregunta original, sino un intercambio de algunos resultados de mis propias pruebas. Esta:
producirá el mismo archivo que:
Entonces, no veo el punto de usar el comando cat.
fuente
<<test
sincat <<test
.Vale la pena señalar que aquí los documentos también funcionan en bash loops. Este ejemplo muestra cómo obtener la lista de columnas de la tabla:
o incluso sin la nueva línea
fuente