GNU/Linux >> Tutoriels Linux >  >> Linux

Comment vérifier si un tube est vide et exécuter une commande sur les données si ce n'est pas le cas ?

J'ai canalisé une ligne dans un script bash et je souhaite vérifier si le canal contient des données avant de le transmettre à un programme.

En cherchant, j'ai trouvé à propos de test -t 0 mais ça ne marche pas ici. Renvoie toujours faux.
Alors, comment être sûr que le tube contient des données ?

Exemple :

echo "string" | [ -t 0 ] && echo "empty" || echo "fill"

Sortie :fill

echo "string" | tail -n+2 | [ -t 0 ] && echo "empty" || echo "fill"

Sortie :fill

Contrairement à la méthode standard/canonique pour tester si le pipeline précédent a produit une sortie ? l'entrée doit être conservée pour la transmettre au programme. Cela généralise Comment canaliser la sortie d'un processus à un autre mais ne s'exécute que si le premier a une sortie? qui se concentre sur l'envoi d'e-mails.

Réponse acceptée :

Il n'y a aucun moyen de jeter un coup d'œil au contenu d'un tube à l'aide d'utilitaires shell couramment disponibles, ni de moyen de lire un caractère du tube puis de le remettre. La seule façon de savoir qu'un tube contient des données est de lire un octet, puis vous devez amener cet octet à sa destination.

Alors faites exactement cela :lisez un octet; si vous détectez une fin de fichier, faites ce que vous voulez faire lorsque l'entrée est vide; si vous lisez un octet, bifurquez ce que vous voulez faire lorsque l'entrée n'est pas vide, dirigez cet octet dedans et dirigez le reste des données.

first_byte=$(dd bs=1 count=1 2>/dev/null | od -t o1 -A n | tr -dc 0-9)
if [ -z "$first_byte" ]; then
  # stuff to do if the input is empty
else
  {
    printf "\$first_byte"
    cat
  } | {
    # stuff to do if the input is not empty
  }      
fi

Le ifne L'utilitaire de moreutils de Joey Hess exécute une commande si son entrée n'est pas vide. Il n'est généralement pas installé par défaut, mais il devrait être disponible ou facile à construire sur la plupart des variantes Unix. Si l'entrée est vide, ifne ne fait rien et renvoie le statut 0, qui ne peut pas être distingué de la commande exécutée avec succès. Si vous voulez faire quelque chose si l'entrée est vide, vous devez faire en sorte que la commande ne renvoie pas 0, ce qui peut être fait en faisant en sorte que le cas de réussite renvoie un état d'erreur distinct :

ifne sh -c 'do_stuff_with_input && exit 255'
case $? in
  0) echo empty;;
  255) echo success;;
  *) echo failure;;
esac

test -t 0 n'a rien à voir avec cela; il teste si l'entrée standard est un terminal. Il ne dit rien dans un sens ou dans l'autre quant à savoir si une entrée est disponible.

Connexe :comment aplatir une image .pdf à partir de la ligne de commande ?
Linux
  1. Comment vérifier la version du système d'exploitation et de Linux

  2. Comment fonctionnent les options '-s', '-t' et '-c' de la commande tr sous Unix ?

  3. Comment exécuter la commande Vim depuis le shell ?

  4. Comment vérifier le système d'exploitation et la version à l'aide d'une commande Linux

  5. Comment puis-je exécuter manuellement une vérification nagios à partir de la ligne de commande ?

Comment utiliser Sudo et le fichier Sudoers

Comment utiliser et tirer le meilleur parti de la commande fuser sous Linux

Comment surveiller la progression des données dans un tube à l'aide de la commande "pv"

Comment installer et utiliser la commande d'écran Ubuntu 20.04

Comment installer et utiliser la commande Ack sous Linux

Linux perf :comment utiliser la commande et le profileur