Tengo un script en el que los datos se procesan transmitiéndolos a través de una canalización bastante grande. Varias secciones de la canalización son en realidad funciones de "panel de control" que hacen cosas diferentes en función de algún parámetro externo. A continuación se proporciona un ejemplo artificial.
#! /bin/bash
switchboard() {
# Select the appropriate command depending on input.
case "$1" in
1)
sort
;;
2)
awk '{ print $5 }' | sort
;;
*)
cat # <= Is there something more optimal here?
;;
esac
}
# The data processing pipeline.
<"$1" tr '[:upper:]' '[:lower:]' | switchboard "$2" | head -n 10
En la función "centralita", la alternativa es simplemente usar cat
para enviar la entrada directamente a la salida. Esto funciona bien, pero en mi canalización puedo tener muchos "paneles de control" y me gustaría evitar crear un montón de cat
que no hacen nada procesos si es posible.
¿Hay algún tipo de bash incorporado (o alternativo) que se pueda usar para especificar que una sección determinada de una tubería debe conectar STDOUT directamente a STDIN sin tener que usar un subproceso? (Probé :
pero eso solo se comió los datos) O, cat
usar una cantidad tan pequeña de recursos que esto no es un problema?
Respuesta aceptada:
Primero, el uso de otro cat
Realmente no hace mucha diferencia, y no deberías preocuparte por eso.
En segundo lugar, los comandos que componen una tubería se ejecutan en procesos separados de todos modos, sin importar si son comandos externos o integrados:
$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0
En cuanto a su problema exacto, no es posible simplemente conectar 'stdin' a 'stdout'; incluso si un caparazón tuviera algo de nop
incorporado que colapsaría cuando se usa en una canalización (por ejemplo, | nop |
-> |
), el shell no tiene forma de saber de antemano, en el momento en que configura la canalización, que su "panel de control" cambiará a nop
en lugar de awk
o sort
.
También puede lograr el mismo efecto que sus "paneles de control" construyendo la canalización usted mismo y luego llamando a eval para ejecutarla. Ejemplo:
$ cat test.shtype=`file -zi "$1"`case $type in*application/gzip*) mycat='zcat "$1"';;*) mycat='cat "$1"';;esaccase $escribir en*charset=utf-16le*) mycat="$mycat | iconv -f utf16le";;esac# resaltar comentarios en blueesc=`printf '