GNU/Linux >> Linux Esercitazione >  >> Linux

Modo per specificare che una sezione di una pipeline sia completamente "passa attraverso"?

Ho uno script in cui i dati vengono elaborati eseguendo lo streaming attraverso una pipeline abbastanza grande. Diverse sezioni della pipeline sono in realtà funzioni di "centralino" che fanno cose diverse in base a parametri esterni. Di seguito viene fornito un esempio inventato.

#! /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

Nella funzione "centralino", il ripiego è usare solo cat per inviare l'input direttamente all'output. Funziona bene, ma nella mia pipeline potrei avere molti "quadri elettrici" e vorrei evitare di creare un mucchio di cat che non fanno nulla processi se possibile.

Esiste una sorta di bash integrato (o alternativo) che può essere utilizzato per specificare che una determinata sezione di una pipeline deve connettere STDOUT direttamente a STDIN senza dover utilizzare un sottoprocesso? (Ho provato : ma quello ha appena mangiato i dati) Oppure, cat utilizzare una quantità così piccola di risorse che questo non è un problema?

Risposta accettata:

Primo, l'uso di un altro cat non fa davvero molta differenza e non dovresti preoccupartene.

In secondo luogo, i comandi che costituiscono una pipeline vengono comunque eseguiti in processi separati, indipendentemente dal fatto che si tratti di comandi esterni o integrati:

$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0

Per quanto riguarda il tuo problema esatto, non è possibile collegare semplicemente "stdin" a "stdout"; anche se una shell avesse qualche nop builtin che collasserebbe se utilizzato in una pipeline (ad esempio | nop | -> | ), la shell non ha modo di sapere in anticipo, nel momento in cui imposta la pipeline, che il tuo "centralino" passerà a nop invece di awk o sort .

Puoi anche ottenere lo stesso effetto dei tuoi "centralini" costruendo tu stesso la pipeline e quindi chiamando eval per eseguirla. Esempio:

$ cat test.shtype=`file -zi "$1"`case $type in*application/gzip*) mycat='zcat "$1"';;*) mycat='cat "$1"';;esaccase $digita*charset=utf-16le*) mycat="$mycat | iconv -f utf16le";;esac# evidenzia i commenti in blueesc=`printf '
Linux
  1. 10 articoli per imparare Linux a modo tuo

  2. CFS:pianificazione dei processi completamente equa in Linux

  3. Modo per modificare un file sul posto?

  4. Abbiamo un annullamento in Linux?

  5. Intestazioni file ELF

Aggiunta di una sezione al file ELF

C'è un modo per copiare il testo in htop?

Pannello Mate completamente sparito

In Crontab modo generico per specificare ogni n min dove n > 60

Il modo più veloce per estrarre tar.gz

Ripristinare completamente PostgreSQL al valore predefinito?