2017-10-20 3 views
0

Avec toutes les questions et réponses sur la redirection des flux de shell, je suis surpris que j'envoie l'un des miens, mais je n'arrive pas à trouver quoi que ce soit semblable en ligne.Shell redirection: La commande ne semble pas sortir sur stdout ou stderr

Pour décrire simplement ma situation, j'essaye d'écrire un script bash qui exécutera une application binaire particulière et regarder la sortie pour des chaînes particulières afin qu'elle puisse agir sur eux.

j'ai pu obtenir la fonctionnalité souhaitée avec un script de test qui se tenait pour mon application binaire. Cependant, en cours d'exécution contre le réel, il ne semble pas capturer toutes les sorties. Quand je lance l'application binaire seul, il produit en tant que tel

status OK 
something A 
something B 
... 
something Z 
status OK 
something A 

Mais lorsque je tente de rediriger cette sortie pour l'analyse, je reçois seulement les lignes « statut OK ». Toutes les bonnes choses entre les deux sont absentes. Cela est vrai même si j'essaie de le rediriger vers un fichier avec>. Au début, je pensais qu'il pourrait mettre "status" sur stdout et le "something" sur stderr, mais cela ne semble pas être le cas.

Si cette application est capable de sortir des choses au terminal que je peux lire, comment je ne suis pas capable de le capturer? Est-il possible que la mise en forme soit étrange de telle sorte qu'elle soit interprétée correctement par l'affichage du terminal, mais d'une manière ou d'une autre par aucune sorte de redirection?

Toute idée serait très apprécié!

+0

S'il vous plaît jeter un oeil à [Comment créer un exemple minimal, complet et Vérifiable] (http://stackoverflow.com/help/mcve). Ajoutez votre code à votre question. – Cyrus

+1

Cela dépend vraiment de ce que fait l'application binaire. Cela pourrait être l'envoi de la sortie vers/dev/tty. Il se peut que ce soit en vérifiant stdout et/ou stderr pour voir s'il s'agit de terminaux. Ça pourrait ... faire presque n'importe quoi. –

+0

@Cyrus Je ne suis pas en mesure de poster le code exact pour des raisons juridiques, mais néanmoins, les détails vitaux sont cachés dans l'application binaire et je n'ai pas le code source. Ma question est principalement de comprendre quelles sont les façons possibles pour qu'une application puisse envoyer du texte au terminal d'une manière qui ne puisse pas être redirigée via> ou 2>.Mais oui, je comprends que c'est une question assez ouverte. – Matt

Répondre

0

@Gordon Davisson est juste sur l'argent. Il semble que la sortie a été envoyée directement à/dev/tty, ce qui est apparemment une chose que les gens font ... Merci, Gordon!

Mise à jour: Lors d'autres modifications et d'autres entrées, il semble que la partie importante utilise script pour capturer toutes les sorties. Une redirection supplémentaire (c'est-à-dire 2>&1) n'est pas nécessaire, mais peut être effectuée si nécessaire. Continuez ci-dessous pour le voir en action.

Voici mon code de base:

L'application binaire qui envoie des données vers/dev/tty est appelé « binApp », et disons qu'il faut un nombre arbitraire d'arguments de ligne de commande. Mon script wrapper/watcher sera exécuté avec binApp et tous ses args, comme ceci:

WrapScript binApp arg1 arg2 ... argn

WrapScript:

#!/bin/bash 

args=("[email protected]") 
cmd=`echo "${args[@]:0}"` 

run() { 
    script -q -c "$cmd" 2>&1 | while read -r line; do 
     if [ "$line" = "$badthing" ]; then 
      echo "restarting..." 
      break 
     fi 
     echo "$line" 
    done 
} 

badthing="ERROR" 

while true; do 
    run 
    sleep 0.5 
done 

Le sleep 0.5 permet à l'utilisateur d'appuyer sur "Ctrl + c" deux fois pour quitter .

+0

Votre définition commence par un '{' et se termine par un 'done' - ce n'est sûrement pas correct. Et pensez à éviter le mot-clé 'function' en faveur de la syntaxe de définition de fonction compatible POSIX, qui est juste' run() {'sans fonction' previous'; De cette façon, votre code fonctionnera avec une plus large gamme de coquilles. –

+0

@CharlesDuffy Bonne prise, merci. – Matt

0

Au lieu de /dev/null>&1, vous devez mettre 2>&1. Cela redirigera le stderr vers la sortie standard et vous verrez les deux de quelque manière que vous l'exécuterez.

+0

Pour une raison quelconque, je pensais que '/ dev/null> & 1' était la balle magique qui faisait tout cela fonctionner, mais j'ai essayé' 2> & 1' sans utiliser de redirection, et ils semblaient tous fonctionner! On dirait que c'est vraiment "script" qui fait tout le travail. Merci! – Matt