GNU/Linux >> Tutoriels Linux >  >> Linux

Façon de spécifier qu'une section d'un pipeline doit être complètement "traversée" ?

J'ai un script dans lequel les données sont traitées en les diffusant via un pipeline assez important. Plusieurs sections du pipeline sont en fait des fonctions de « standard » qui font différentes choses en fonction de certains paramètres externes. Un exemple artificiel est donné ci-dessous.

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

Dans la fonction « standard », la solution de repli consiste simplement à utiliser cat pour envoyer l'entrée directement à la sortie. Cela fonctionne très bien, mais dans mon pipeline, j'ai peut-être de nombreux "standards" et j'aimerais éviter de créer un tas de cat qui ne font rien processus si possible.

Existe-t-il une sorte de bash intégré (ou alternatif) pouvant être utilisé pour spécifier qu'une section donnée d'un pipeline doit connecter STDOUT directement à STDIN sans avoir à utiliser de sous-processus? (J'ai essayé : mais qui a juste mangé les données) Ou, est-ce que cat utiliser une si petite quantité de ressources que ce n'est pas un problème ?

Réponse acceptée :

Tout d'abord, l'utilisation d'un autre cat ne fait pas vraiment de différence, et vous ne devriez pas vous en préoccuper.

Deuxièmement, les commandes qui composent un pipeline sont de toute façon exécutées dans des processus séparés, qu'il s'agisse de commandes externes ou intégrées :

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

Quant à votre problème exact, il n'est pas possible de connecter simplement "stdin" à "stdout" ; même si un shell avait des nop intégré qui s'effondrerait lorsqu'il est utilisé dans un pipeline (par exemple | nop | -> | ), le shell n'a aucun moyen de savoir à l'avance, au moment où il configure le pipeline, que votre « standard » passera en nop au lieu de awk ou sort .

Vous pouvez également obtenir le même effet que vos « tableaux de contrôle » en construisant vous-même le pipeline, puis en appelant eval pour l'exécuter. Exemple :

$ 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# surligne les commentaires dans blueesc=`printf '
Linux
  1. Manière de modifier un fichier sur place ?

  2. Avons-nous une annulation sous Linux ?

  3. Ny façon d'utiliser Xargs à travers un tuyau?

  4. Way To 'tail -f' A Folder??

  5. En-têtes de fichiers ELF

10 articles pour apprendre Linux à votre façon

CFS :Ordonnancement de processus totalement équitable sous Linux

N'importe quel moyen de spécifier l'emplacement des données de profil

Existe-t-il un moyen de redémarrer les badblocks ?

Dans Crontab, manière générique de spécifier toutes les n minutes où n> 60

Réinitialiser complètement PostgreSQL par défaut ?