Modifier `whatis` pour renvoyer un code d'erreur pour les commandes manquantes

0

Suivi de "whatis" renvoie 0 pour les commandes manquantes , J'essaie de modifier /usr/bin/whatis pour renvoyer un code de sortie différent de zéro après avoir entré une commande inappropriée. Mon approche consiste à ajouter une variable de retour dans le segment suivant et à renvoyer cette variable à la fin de la boucle.

while [ "$1" != "" ]
do
    found=0
    for d in /var/cache/man $manpath /usr/lib
    do
        if [ -f $d/whatis ]
        then
            if grep -"$grepopt1" "$grepopt2""$1" $d/whatis
            then
                found=1
            fi
        fi
    done

    if [ $found = 0 ]
    then
        echo "$1: nothing appropriate"
        **code=1**
    fi

    shift
done | eval ${PAGER:-more -E}
**return $code**

Cependant, depuis le while la boucle est canalisée dans eval, il est exécuté dans un sous-shell afin code ne sera pas attribué en dehors de la while boucle. j'ai essayé plusieurs différent les méthodes Cependant, il s’agit de canaliser une valeur dans le while boucle, pas de piping une valeur de la while boucle.

Une solution de contournement que j'ai trouvée consiste simplement à supprimer l'intégralité du eval déclaration, mais je voudrais une méthode qui préserve l'extensibilité initiale de whatis

Max Coplan
la source

Réponses:

1

PIPESTATUS est un tableau. Puisque vous avez seulement besoin $[PIPESTATUS[0]}, l'indice peut être omis.

(
    code=0
    while [ "$1" != "" ]
    do
        found=0
        for d in /var/cache/man $manpath /usr/lib
        do
            if [ -f $d/whatis ]
            then
                if grep -"$grepopt1" "$grepopt2""$1" $d/whatis
                then
                    found=1
                fi
            fi
        done

        if [ $found = 0 ]
        then
            echo "$1: nothing appropriate"
            code=1
        fi

        shift
    done
    exit $code
) | eval ${PAGER:-more -E}
return $PIPESTATUS

De man bash:

   PIPESTATUS
          An array variable (see Arrays below) containing a list  of  exit
          status  values  from the processes in the most-recently-executed
          foreground pipeline (which may contain only a single command).
David Anderson
la source
Essayant de revenir $PIPESTATUS donne l'erreur suivante $ whatis hi hi: nothing appropriate /usr/local/bin/whatis: line 92: return: can only `return' from a function or sourced script Cependant, faire exit $PIPESTATUS au lieu de return fonctionne bien
Max Coplan
Je n'ai jamais exécuté votre script. Je n'ai pas non plus essayé de corriger les erreurs que vous avez pu commettre. Je ne pensais pas que tu me le demandes. Vous avez demandé comment lire la valeur de la variable code une fois le tuyau terminé, c’est ce que j’ai mis dans ma réponse. Si vous voulez que quelqu'un écrive votre script, posez une nouvelle question. De plus, si vous le souhaitez, n'hésitez pas à modifier votre question et / ou ma réponse. Ou postez votre propre réponse.
David Anderson