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 '