GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Möglichkeit, einen Abschnitt einer Pipeline vollständig „durchzuleiten“?

Ich habe ein Skript, in dem Daten verarbeitet werden, indem sie durch eine ziemlich große Pipeline gestreamt werden. Mehrere Abschnitte der Pipeline sind tatsächlich „Schalttafel“-Funktionen, die auf der Grundlage einiger externer Parameter unterschiedliche Dinge tun. Ein erfundenes Beispiel ist unten angegeben.

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

In der Funktion „Zentrale“ besteht der Fallback nur darin, cat zu verwenden um die Eingabe direkt an die Ausgabe zu senden. Das funktioniert ganz gut, aber in meiner Pipeline habe ich möglicherweise viele „Schalttafeln“ und ich möchte vermeiden, einen Haufen von Nichtstun-cat zu erstellen Prozesse, wenn möglich.

Gibt es eine Art eingebaute Bash (oder Alternative), die verwendet werden kann, um anzugeben, dass ein bestimmter Abschnitt einer Pipeline STDOUT direkt mit STDIN verbinden soll, ohne einen Unterprozess verwenden zu müssen? (Ich habe versucht : aber das hat nur die Daten gefressen) Oder tut cat Verwenden Sie so wenig Ressourcen, dass dies kein Problem darstellt?

Akzeptierte Antwort:

Erstens die Verwendung einer weiteren cat macht keinen großen Unterschied, und Sie sollten sich nicht darum kümmern.

Zweitens werden die Befehle, aus denen eine Pipeline besteht, sowieso in separaten Prozessen ausgeführt, egal ob es sich um externe Befehle oder integrierte Befehle handelt:

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

Was Ihr genaues Problem betrifft, ist es nicht möglich, „stdin“ einfach mit „stdout“ zu verbinden. selbst wenn eine Shell einige nop hatte builtin, das zusammenbrechen würde, wenn es in einer Pipeline verwendet würde (z. B. | nop | -> | ), kann die Shell zum Zeitpunkt der Einrichtung der Pipeline nicht im Voraus wissen, dass Ihre „Zentrale“ auf nop umschalten wird statt awk oder sort .

Sie können den gleichen Effekt wie Ihre „Schalttafeln“ erzielen, indem Sie die Pipeline selbst erstellen und dann eval aufrufen, um sie auszuführen. Beispiel:

$ cat test.shtype=`file -zi "$1"`case $type in*application/gzip*) mycat='zcat "$1"';;*) mycat='cat "$1"';;esaccase $type in*charset=utf-16le*) mycat="$mycat | iconv -f utf16le";;esac# Hervorhebung von Kommentaren in blueesc=`printf '
Linux
  1. Möglichkeit, eine Datei direkt zu ändern?

  2. Haben wir ein Undo in Linux?

  3. Neue Möglichkeit, Xargs über eine Pipe zu verwenden?

  4. Weg, einen Ordner zu "tail -f"?

  5. ELF-Datei-Header

Abschnitt zur ELF-Datei hinzufügen

Gibt es eine Möglichkeit, spaltenweise zu 'uniq'?

r linux vollständig deinstallieren

Gibt es eine Möglichkeit, Text in htop zu kopieren?

Mate-Panel komplett weg

In Crontab generische Art, alle n Minuten anzugeben, wobei n > 60 ist