2016-07-18 20 views
-4

Dies ist wahrscheinlich ein dummer Fehler, den ich irgendwo gemacht habe, aber ich kann einfach nicht herausfinden, was los ist. Hoffe ich kann hier Hilfe finden.Bash - Zurück Tick Invocation Blöcke für immer

Ich habe ein Skript callee.sh, erwartet einige optionale Variable $1,$2,$3 etc ... und es tut eine Menge von Echo im Skript (also, mehrere Zeilen der Ausgabe) Ich möchte nur die letzte Zeile als Ergebnis. Die anderen Zeilen sind nur Debug-Statusberichte.

Sie versuchen, wann das Ergebnis einer Variablen wie diese

result=`./callee.sh | tail -n 1` Es perfekt

Allerdings funktioniert zuweisen, wenn es Parameter nimmt

result=`./callee.sh param1 param2 param2 | tail -n 1` Der Code würde für immer blockieren, nie eintritt callee.sh

Nur für Vergleich Ich habe versucht,

ausgeführt result=`./callee.sh`, Das funktioniert aber alle Zeilen einer Zeile anhängen (das ist in Ordnung)

aber

result=`./callee.sh param1 param2 param2` hängt auch immer läuft. Niemals eingeben callee.sh

Was habe ich falsch gemacht? Was soll ich stattdessen tun?

+2

Wie lange dauert der Befehl './callee.sh param1 parm22 param2' (ohne Backticks)? – Leon

+0

danke für den Hinweis auf den Tippfehler. Behoben – user1763590

+6

Wenn './Callee.sh' zum Abschluss läuft, aber' ./callee.sh param1 param2 param2 'für immer hängt, dann ist Ihr Problem in 'callee.sh'. – John1024

Antwort

-1

Wenn der Aufruf von callee.sh hängt mit Parametern, versuchen Sie es außerhalb des Skripts mit Parametern und überprüfen Sie, ob es auch dort hängt ... Anyways, der beste Weg zum Speichern der Ausgabe (und zum Ausdrucken danach):

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

Ja, es hängt, wenn ich das Skript so nenne. Als ich sagte hängen ich meine das Skript wird nie eingegeben. Der Grund, warum ich zu "Schwanz" inline versucht habe, ist, weil sonst der Multi-Line-Output in 1 Zeile angehängt würde und '' tail''' würde das Ganze zurückgeben, was ich nicht brauche. Aber das ist nebensächlich. Auch ohne '' 'tail''' wird das Skript nie aufgerufen. – user1763590

0

Sie wissen nicht, ohne den Code, aber die kurze Antwort ist

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

statt Backticks zu verwenden. $(...) behandelt ordnungsgemäß verschachtelte Klammern.

Verwenden Sie auch / anstelle von \.

Und wie @Leon darauf hingewiesen hat, verwenden Sie tail -1 oder tail -n 1, nicht tail -n -1.

+0

' '' result = $ (./ callee.sh param1 param2 param3) '' ' Bleibt auch für immer. Ich gebe nie '' './Callee.sh''' ein. Das Problem, das ich habe, scheint nichts mit verschachtelten Backticks zu tun zu haben, aber – user1763590

+1

Das ist hauptsächlich ein Stilvorschlag; obwohl ein sehr guter, wird es das Problem des OP nicht lösen. – chepner

+2

@ user1763590 Woher weißt du, dass es 'callee.sh' nicht eingibt, anstatt innerhalb' callee.sh' zu hängen? Bitte schneiden Sie 'callee.sh' und den aufrufenden Code auf das kleinste Beispiel herunter, das das Problem immer noch anzeigt, und bearbeiten Sie dann Ihre Frage (http://stackoverflow.com/posts/38443957/edit), um den Code dieses Beispiels einzufügen , sowohl das aufrufende Skript als auch 'callee.sh'. Vielen Dank! – cxw