A menudo veo tutoriales en línea que conectan varios comandos con diferentes símbolos. Por ejemplo:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Otros parecen estar conectando comandos a archivos:
command1 > file1
command1 >> file1
¿Qué son estas cosas? ¿Cómo se llaman? ¿Qué hacen? ¿Hay más de ellos?
Meta hilo sobre esta pregunta..
Respuesta aceptada:
Estos se llaman operadores de shell y sí, hay más de ellos. Daré una breve descripción de los más comunes entre las dos clases principales, operadores de control y operadores de redirección, y cómo funcionan con respecto al shell bash.
A. Operadores de control
Definición de POSIX
En el lenguaje de comandos de shell, un token que realiza una función de control.
Es uno de los siguientes símbolos:
& && ( ) ; ;; <newline> | ||
Y |&
en bash.
Un !
es no un operador de control sino una palabra reservada. Se convierte en un NOT [operador de negación] lógico dentro de las expresiones aritméticas y dentro de las construcciones de prueba (aunque aún requiere un delimitador de espacio).
A.1 Terminadores de lista
-
;
:Ejecutará un comando después de que otro haya finalizado, independientemente del resultado del primero.command1 ; command2
Primer
command1
se ejecuta, en primer plano, y una vez finalizado,command2
se ejecutará.Una nueva línea que no está en un literal de cadena o después de ciertas palabras clave es no equivalente al operador punto y coma. Una lista de
;
los comandos simples delimitados siguen siendo una lista – como en el analizador del shell, aún debe continuar leyendo los comandos simples que siguen a un;
comando simple delimitado antes de ejecutarse, mientras que una nueva línea puede delimitar una lista de comandos completa, o una lista de listas. La diferencia es sutil, pero complicada:dado que el shell no tiene un imperativo previo para leer datos después de una nueva línea, la nueva línea marca un punto donde el shell puede comenzar a evaluar los comandos simples que ya ha leído, mientras que un;
punto y coma no. -
&
:Esto ejecutará un comando en segundo plano, permitiéndole continuar trabajando en el mismo shell.command1 & command2
Aquí,
command1
se ejecuta en segundo plano ycommand2
comienza a ejecutarse en primer plano inmediatamente, sin esperarcommand1
para salir.Una nueva línea después de
command1
es opcional.
A.2 Operadores lógicos
-
&&
:Usado para construir listas AND, le permite ejecutar un comando solo si otro salió con éxito.command1 && command2
Aquí,
command2
se ejecutará después decommand1
ha terminado y solo sicommand1
tuvo éxito (si su código de salida era 0). Ambos comandos se ejecutan en primer plano.Este comando también se puede escribir
if command1 then command2 else false fi
o simplemente
if command1; then command2; fi
si se ignora el estado de retorno. -
||
:Usado para construir listas OR, le permite ejecutar un comando solo si otro salió sin éxito.command1 || command2
Aquí,
command2
solo se ejecutará sicommand1
falló (si devolvió un estado de salida distinto de 0). Ambos comandos se ejecutan en primer plano.Este comando también se puede escribir
if command1 then true else command2 fi
o de forma más corta
if ! command1; then command2; fi
.Tenga en cuenta que
&&
y||
son asociativos por la izquierda; consulte Precedencia de los operadores lógicos de shell &&, || para más información. -
!
:esta es una palabra reservada que actúa como el operador "no" (pero debe tener un delimitador), que se usa para negar el estado de devolución de un comando:devuelve 0 si el comando devuelve un estado distinto de cero, devuelve 1 si devuelve el estado 0 También un NO lógico para eltest
utilidad.! command1 [ ! a = a ]
Y un verdadero operador NOT dentro de expresiones aritméticas:
$ echo $((!0)) $((!23)) 1 0
A.3 Operador de tubería
-
|
:El operador de tubería, pasa la salida de un comando como entrada a otro. Un comando creado a partir del operador de canalización se denomina canalización.command1 | command2
Cualquier salida impresa por
command1
se pasa como entrada acommand2
. -
|&
:Esta es una abreviatura de2>&1 |
en bash y zsh. Pasa tanto la salida estándar como el error estándar de un comando como entrada a otro.command1 |& command2
A.4 Otra lista de puntuación
;;
se utiliza únicamente para marcar el final de una declaración de caso. Ksh, bash y zsh también son compatibles con ;&
pasar al siguiente caso y ;;&
(no en ATT ksh) para continuar y probar casos posteriores.
(
y )
se utilizan para agrupar comandos y ejecutarlos en una subcapa. {
y }
también agrupa comandos, pero no los ejecutes en una subcapa. Consulte esta respuesta para ver una discusión sobre los distintos tipos de paréntesis, corchetes y llaves en la sintaxis de shell.
B. Operadores de redirección
Definición POSIX de operador de redirección
En el lenguaje de comandos de shell, un token que realiza una función de redirección. Es uno de los siguientes símbolos:
< > >| << >> <& >& <<- <>
Estos le permiten controlar la entrada y salida de sus comandos. Pueden aparecer en cualquier lugar dentro de un comando simple o pueden seguir un comando. Las redirecciones se procesan en el orden en que aparecen, de izquierda a derecha.
-
<
:Da entrada a un comando.command < file.txt
Lo anterior ejecutará
command
sobre el contenido defile.txt
. -
<>
:igual que arriba, pero el archivo está abierto en lectura+escritura modo en lugar de solo lectura :command <> file.txt
Si el archivo no existe, se creará.
Ese operador rara vez se usa porque los comandos generalmente solo leen de su entrada estándar, aunque puede ser útil en varias situaciones específicas.
-
>
:Dirige la salida de un comando a un archivo.command > out.txt
Lo anterior guardará la salida del
command
comoout.txt
. Si el archivo existe, se sobrescribirá su contenido y si no existe, se creará.Este operador también se usa a menudo para elegir si algo debe imprimirse con un error estándar o una salida estándar:
command >out.txt 2>error.txt
En el ejemplo anterior,
>
redirigirá la salida estándar y2>
redirige el error estándar. La salida también se puede redirigir usando1>
pero, dado que este es el valor predeterminado, el1
generalmente se omite y se escribe simplemente como>
.Entonces, para ejecutar
command
enfile.txt
y guarde su salida enout.txt
y cualquier mensaje de error enerror.txt
ejecutarías:command < file.txt > out.txt 2> error.txt
-
>|
:Hace lo mismo que>
, pero sobrescribirá el destino, incluso si el shell se ha configurado para rechazar la sobrescritura (conset -C
oset -o noclobber
).command >| out.txt
Si
out.txt
existe, la salida delcommand
reemplazará su contenido. Si no existe se creará. -
>>
:Hace lo mismo que>
, excepto que si el archivo de destino existe, se adjuntan los nuevos datos.command >> out.txt
Si
out.txt
existe, la salida delcommand
se añadirá a él, después de lo que ya está en él. Si no existe se creará. -
>&
:(según la especificación POSIX) cuando está rodeado de dígitos (1>&2
) o-
en el lado derecho (1>&-
) redirige solo a uno descriptor de archivo o lo cierra (>&-
).Un
>&
seguido de un número de descriptor de archivo es una forma portátil de redirigir un descriptor de archivo, y>&-
es una forma portátil de cerrar un descriptor de archivo.Si el lado derecho de esta redirección es un archivo, lea la siguiente entrada.
-
>&
,&>
,>>&
y&>>
:(leer arriba también) Redirigir tanto el error estándar como la salida estándar, reemplazando o agregando, respectivamente.command &> out.txt
Tanto el error estándar como la salida estándar del
command
se guardará enout.txt
, sobrescribiendo su contenido o creándolo si no existe.command &>> out.txt
Como arriba, excepto que si
out.txt
existe, la salida y el error decommand
se adjuntará a ella.El
&>
la variante se origina enbash
, mientras que>&
variante proviene de csh (décadas antes). Ambos entran en conflicto con otros operadores de shell POSIX y no deben usarse en portátilessh
guiones. -
<
:Un documento aquí. A menudo se usa para imprimir cadenas de varias líneas.command << WORD Text WORD
Aquí,
command
tomará todo hasta que encuentre la siguiente ocurrencia deWORD
,Text
en el ejemplo anterior, como input . MientrasWORD
es a menudoEoF
o variaciones de la misma, puede ser cualquier cadena alfanumérica (y no solo) que desee. CuandoWORD
se cita, el texto del presente documento se trata literalmente y no se realizan expansiones (en variables, por ejemplo). Si no está entre comillas, las variables se expandirán. Para obtener más detalles, consulte el manual de bash.Si desea canalizar la salida del comando
command << WORD ... WORD
directamente a otro comando o comandos, debe colocar la tubería en la misma línea que<< WORD
, no puede ponerlo después de la PALABRA final o en la línea siguiente. Por ejemplo:command << WORD | command2 | command3... Text WORD
-
<<<
:Cadenas Here, similares a los documentos Here, pero pensadas para una sola línea. Estos existen solo en el puerto Unix o rc (donde se originó), zsh, algunas implementaciones de ksh, yash y bash.command <<< WORD
Lo que se da como
WORD
se expande y su valor se pasa como entrada acommand
. Esto se usa a menudo para pasar el contenido de las variables como entrada a un comando. Por ejemplo:$ foo="bar" $ sed 's/a/A/' <<< "$foo" bAr # as a short-cut for the standard: $ printf '%sn' "$foo" | sed 's/a/A/' bAr # or sed 's/a/A/' << EOF $foo EOF
Algunos otros operadores (>&-
, x>&y
x<&y
) se puede utilizar para cerrar o duplicar descriptores de archivos. Para obtener detalles sobre ellos, consulte la sección correspondiente del manual de su shell (aquí, por ejemplo, para bash).
Eso solo cubre los operadores más comunes de shells tipo Bourne. Algunos shells tienen algunos operadores de redirección adicionales propios.
Ksh, bash y zsh también tienen construcciones <(…)
, >(…)
y =(…)
(este último en zsh
solamente). No se trata de redirecciones, sino de sustitución de procesos.