Comment tester si une sortie de commande n’est pas vide dans le shell POSIX?

Comment vérifier efficacement si une commande arbitraire produit une sortie dans le shell POSIX? (Disons git ls-files --killed .)

Il y a trois manières évidentes, mais chacune me semble laide ou diabolique:

  1. [-n “$ (git ls-files –killed)”] – la sortie complète de la commande doit être capturée en mémoire et transmise à test (ce qui est au moins une intégration)
  2. [“$ (git ls-files –killed | wc -c)” -gt 0] – deux exécuteurs impliqués
  3. TMP = $ (fichier temporaire); git ls-files –killed> “$ tempfile”; [-s “$ tempfile”] && …; rm “$ tempfile” – un fichier temporaire intermédiaire (capturant à nouveau toutes les sorties) est requirejs

Vous pouvez également vérifier le statut de sortie de la commande. En général, les commandes exécutées avec succès renvoient un statut de sortie 0.

 git ls-files --killed > /dev/null if [ $? -eq 0 ] 

OU si vous ne souhaitez que dépendre de la sortie de la commande, vous pouvez utiliser la ” head -1 ” avec votre 1ère option car de toute façon, vous ne faites aucun traitement avec votre sortie de commande en plus de connaître le résultat.

Ma solution préférée utilise le shell intégré au shell POSIX

 if git ls-files --killed | read REPLY; then echo "Some output" else echo "No output or git failed" fi 

read tente de lire une ligne depuis stdin (et dans la variable REPLY ) et renvoie 0 si elle réussit ou un code de sortie positif en cas d’échec. Le rest du pipeline n’est pas lu. En bash seulement, REPLY est le nom par défaut s’il est omis, donc la read REPLY peut être raccourcie en read .

Un inconvénient potentiel de cette approche est que le code de sortie du programme en question (git dans votre exemple) n’est pas vérifié.

Vous pensez peut-être que cette solution est aussi pirate que les autres, mais je pense qu’elle utilise moins de mémoire que les autres (je ne suis pas expert en efficacité des scripts shell).

Le code est seulement bash:

 z=0 while read -r -n1 char; do z=1 break done < <(git ls-files --killed) [ $z != 0 ] 

Il utilise une variable temporaire au lieu d'un fichier temporaire, et je pense que read ne fonctionne qu'avec un caractère à la fois, mais la commande git ls-files peut encore s'exécuter complètement.

Ce n'est peut-être pas beaucoup moins laid, mais je pense que cela peut être au moins plus efficace.

Parce que vous mentionnez POSIX, je vous renvoie à cette réponse
Je voudrais utiliser / usr / bin / test car il est requirejs sur les systèmes POSIX.

/usr/bin/test -n "$(git ls-files --killed)"