GNU/Linux >> Tutoriales Linux >  >> Linux

manera de especificar que una sección de una tubería sea completamente "pasante"?

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 '
Linux
  1. 10 artículos para aprender Linux a tu manera

  2. CFS:programación de procesos completamente justa en Linux

  3. Cualquier forma de especificar la ubicación de los datos del perfil

  4. Agregar sección al archivo ELF

  5. ¿Hay alguna manera de reiniciar badblocks?

desinstalar completamente r linux

¿Hay alguna manera de copiar texto en htop?

Panel de mate completamente desaparecido

En la forma genérica de Crontab para especificar cada n minutos donde n > 60

Especificar la posición de salida de la tubería

¿Restablecer completamente PostgreSQL a su valor predeterminado?