Lorsque le code d'état est inutile, existe-t-il de toute façon de construire un pipeline basé sur la sortie de stdout?
Je préférerais que la réponse ne traite pas du cas d'utilisation, mais de la question relative à la portée des scripts shell. Ce que j'essaie de faire, c'est de trouver le package le plus spécifique disponible dans le référentiel en devinant le nom en fonction des codes de pays et de langue.
Prenez par exemple ceci,
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
La première supposition est plus appropriée mais elle peut ne pas exister. Dans ce cas, je veux retourner hunspell-en
( $PACKAGE2
) car la première option hunspell-en-zz
( $PACKAGE1
) n'existe pas .
pipelines d'apt-cache
La commande apt-cache
renvoie succès (qui est défini par shell comme code de sortie zéro) chaque fois que la commande est en mesure de s'exécuter (à partir des documents de apt-cache
)
apt-cache renvoie zéro en fonctionnement normal, 100 décimal en cas d'erreur.
Cela rend l'utilisation de la commande dans un pipeline plus difficile. Normalement, je m'attends à ce que l'équivalent de recherche de package d'un 404 entraîne une erreur (comme cela se produirait avec curl
ou wget
). Je veux rechercher pour voir si un paquet existe, et sinon, revenir à un autre paquet s'il existe .
Cela ne renvoie rien, car la première commande retourne le succès (donc le rhs dans le ||
ne s'exécute jamais)
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
avec deux arguments
Cela ne renvoie rien, comme apt-cache
ANDs ses arguments,
apt-cache search hunspell-en-zz hunspell-en
D'après les documents de apt-cache
Des arguments séparés peuvent être utilisés pour spécifier plusieurs modèles de recherche qui sont and'és ensemble.
Donc, comme l'un de ces arguments n'existe clairement pas, cela ne renvoie rien.
La question
Quel est l'idiome du shell pour gérer des conventions comme celles trouvées apt-cache
là où le code de retour est inutile pour la tâche? Et le succès n'est déterminé que par la présence de sortie sur STDOUT?
Semblable à
faire échouer quand rien n'a été trouvé
ils découlent tous deux du même problème. La réponse choisie y mentionne
find -z
ce qui n'est malheureusement pas applicable ici et est spécifique au cas d'utilisation. Il n'y a aucune mention d'un idiome ou de la construction d'un pipeline sans utiliser la terminaison nulle (pas une option surapt-cache
)
hunspell-ar
existe et il n'y a pas de packages de noms de pays. J'ai besoin de trouver le package le plus précis pour un pays et une langue donnés.
find
est comme apt-cache
à cet égard - code retour inutile, le succès est basé sur la sortie.
-z
ce qui n'est malheureusement pas une solution ici, donc le problème spécifique au cas d'utilisation n'est pas applicable. Et il n'y a aucune mention d'un idiome ou de la construction d'un pipeline sans utiliser la terminaison nulle (pas une option sur apt-cache
)
find
à être utilisé avec -print0
et donc à utiliser -z
. Puisque apt-cache ne donne pas de sortie terminée par null, vous n'en avez pas besoin -z
.
hunspell-en
existe? Quoi qu'il en soit, vous pouvez utiliserapt-cache policy
et grep for^$PACKAGENAME:
.