2016-07-18 1 views
-4

C'est probablement une erreur stupide que j'ai commise quelque part mais je n'arrive pas à comprendre ce qui se passe. En espérant que je puisse trouver de l'aide ici.Bloquez l'invocation de tic-tac pour toujours

J'ai un script callee.sh qui attend une variable optionnelle $1,$2,$3 etc ... et il fait un tas d'écho dans le script (donc, plusieurs lignes de sortie) Je ne veux que la dernière ligne comme résultat. Les autres lignes ne sont que des rapports d'état de débogage.

lorsque vous essayez d'affecter le résultat à une variable comme celui-ci

result=`./callee.sh | tail -n 1` Il fonctionne parfaitement

Cependant, si elle prend le paramètre

result=`./callee.sh param1 param2 param2 | tail -n 1` Le code bloquerait pour toujours, entrer jamais callee.sh

Juste pour comparsion j'ai essayé de courir

result=`./callee.sh`, cela fonctionne, mais toutes les lignes sont append à une ligne (c'est très bien)

mais en cours d'exécution

result=`./callee.sh param1 param2 param2` aussi jamais accroché. N'a pas entré callee.sh

Qu'est-ce que j'ai fait de mal? Que devrais-je faire à la place?

+2

Combien de temps faut-il pour exécuter la commande './callee.sh param1 param2 param2' (sans les guillemets)? – Leon

+0

merci de souligner la faute de frappe. Correction de – user1763590

+6

Si '. ​​/ Callee.sh' se termine mais que' ./callee.sh param1 param2 param2' se bloque pour toujours, alors votre problème se trouve dans 'callee.sh'. – John1024

Répondre

-1

Si l'appel à callee.sh est suspendu avec des paramètres, essayez de l'exécuter en dehors du script avec des paramètres et vérifiez s'il y est également accroché ... Quoi qu'il en soit, le meilleur moyen de sauver la sortie (et de l'imprimer après):

result="$(./callee.sh param1 param2 param2)" 
echo "${result}" <--- this should show the line breaks 
+0

ouais, ça se bloque quand j'appelle le script comme ça aussi. Quand j'ai dit pendre je veux dire que le script n'est jamais entré. La raison pour laquelle j'ai essayé de '' 'tail''' en ligne est parce que sinon la sortie multi-lignes serait ajoutée en 1 ligne et' 'tail''' retournerait tout ce qui n'est pas ce dont j'ai besoin. Mais c'est hors sujet. Même sans '' 'tail''' le script n'est jamais appelé non plus. – user1763590

0

Je ne sais pas sans le code, mais la réponse courte est d'utiliser

result=$(./callee.sh ...) 

au lieu de contre-apostrophes. $(...) gère correctement les parenthèses imbriquées. En outre, utilisez / au lieu de \. Et, comme @Leon l'a souligné, utilisez tail -1 ou tail -n 1, pas tail -n -1.

+0

' '' résultat = $ (./ callee.sh param1 param2 param3) '' ' S'arrête aussi pour toujours. Ne jamais entrer '' './Callee.sh''' Le problème que je rencontre ne semble pas avoir de lien avec les backticks imbriqués. – user1763590

+1

C'est principalement une suggestion de style; Bien que très bon, cela ne résoudra pas le problème du PO. – chepner

+2

@ user1763590 Comment savez-vous qu'il n'entrent pas dans 'callee.sh' plutôt que dans" callee.sh "? S'il vous plaît couper 'callee.sh' et le code appelant vers le plus petit exemple qui montre encore le problème, puis [modifier votre question] (http://stackoverflow.com/posts/38443957/edit) pour inclure le code de cet exemple , à la fois le script appelant et 'callee.sh'. Je vous remercie! – cxw