Ich habe ein Skript 'myscript', das Folgendes ausgibt:
abc
def
ghi
In einem anderen Skript rufe ich auf:
declare RESULT=$(./myscript)
und $RESULT
bekommt den Wert
abc def ghi
Gibt es eine Möglichkeit, das Ergebnis entweder mit den Zeilenumbrüchen oder mit dem Zeichen '\ n' zu speichern, damit ich es mit ' echo -e
' ausgeben kann ?
Antworten:
Tatsächlich enthält RESULT, was Sie wollen - um zu demonstrieren:
Was Sie zeigen, ist das, was Sie bekommen von:
Wie in den Kommentaren erwähnt, besteht der Unterschied darin, dass (1) die doppelt zitierte Version der Variablen (
echo "$RESULT"
) den internen Abstand des Werts genau so beibehält, wie er in der Variablen dargestellt wird - Zeilenumbrüche, Tabulatoren, mehrere Leerzeichen und alles - während (2) ) Die nicht zitierte Version (echo $RESULT
) ersetzt jede Folge von einem oder mehreren Leerzeichen, Tabulatoren und Zeilenumbrüchen durch ein einzelnes Leerzeichen. Somit behält (1) die Form der Eingabevariablen bei, während (2) eine möglicherweise sehr lange einzelne Ausgabezeile mit durch einzelne Leerzeichen getrennten "Wörtern" erzeugt (wobei ein "Wort" eine Folge von Nicht-Leerzeichen ist; dies ist nicht erforderlich in keinem der Wörter alphanumerisch sein).quelle
Ein weiterer Fallstrick dabei ist , dass Kommandosubstitution -
$()
- Streifen Hinterzeilenumbrüche. Wahrscheinlich nicht immer wichtig, aber wenn Sie wirklich genau das beibehalten möchten, was ausgegeben wurde, müssen Sie eine andere Zeile und einige Anführungszeichen verwenden:Dies ist besonders wichtig, wenn Sie alle möglichen Dateinamen verarbeiten möchten (um undefiniertes Verhalten wie das Bearbeiten der falschen Datei zu vermeiden).
quelle
pwd=`pwd`; ls $pwd/$file
, haben Sie vor dem eine neue Zeile erhalten/
, und es hat nicht geholfen, den Namen in doppelte Anführungszeichen zu setzen. Es wurde schnell behoben. Dies war in den Jahren 1983-5 auf ICL Perq PNX; Die Shell hatte keine$PWD
eingebaute Variable.Wenn Sie an bestimmten Zeilen interessiert sind, verwenden Sie ein Ergebnis-Array:
quelle
readarray
Substitution anstelle der Befehlssubstitution verwenden und verarbeiten :readarray -t RESULT < <(./myscript>
.Zusätzlich zu der Antwort von @ l0b0 Ich hatte gerade die Situation , wo ich beide benötigen durch das Skript all nachgestellten newlines Ausgabe halten und überprüft das Rückkehrcode des Skripts. Und das Problem mit der Antwort von l0b0 ist, dass das 'echo x' $ zurückgesetzt hat? zurück auf Null ... also habe ich es geschafft, diese sehr listige Lösung zu finden:
quelle
die ()
Funktion haben möchte , die einen beliebigen Exit-Code und optional eine Nachricht akzeptiert, und ich wollte eine andereusage ()
Funktion verwenden, um die Nachricht zu liefern, aber die Zeilenumbrüche wurden immer wieder gequetscht, hoffentlich kann ich das das umgehen.Nachdem ich die meisten Lösungen hier ausprobiert hatte, war das Einfachste, was ich fand, das Offensichtliche - die Verwendung einer temporären Datei. Ich bin mir nicht sicher, was Sie mit Ihrer mehrzeiligen Ausgabe machen möchten, aber Sie können dann zeilenweise mit read damit umgehen. Das Einzige, was Sie nicht wirklich tun können, ist, alles einfach in dieselbe Variable zu stecken, aber für die meisten praktischen Zwecke ist dies viel einfacher zu handhaben.
Schneller Hack, damit es die angeforderte Aktion ausführt:
Beachten Sie, dass dies eine zusätzliche Zeile hinzufügt. Wenn du daran arbeitest, kannst du es umschreiben, ich bin einfach zu faul.
BEARBEITEN: Während dieser Fall perfekt funktioniert, sollten sich die Leser bewusst sein, dass Sie Ihr stdin leicht in der while-Schleife quetschen können, wodurch Sie ein Skript erhalten, das eine Zeile ausführt, stdin löscht und beendet. Wie wird ssh das tun, denke ich? Ich habe es erst kürzlich gesehen, andere Codebeispiele hier: /unix/24260/reading-lines-from-a-file-with-bash-for-vs-while
Ein Mal noch! Diesmal mit einem anderen Dateihandle (stdin, stdout, stderr sind 0-2, also können wir & 3 oder höher in bash verwenden).
Sie können auch mktemp verwenden, dies ist jedoch nur ein kurzes Codebeispiel. Die Verwendung für mktemp sieht folgendermaßen aus:
Verwenden Sie dann $ filenamevar wie den tatsächlichen Namen einer Datei. Wahrscheinlich muss hier nicht erklärt werden, aber jemand hat sich in den Kommentaren beschwert.
quelle
bash
Fallstricke .read
Befehlserweiterung verwenden-u 3
, um aus Dateideskriptor 3 zu lesen.Wie wäre es damit, es liest jede Zeile in eine Variable und das kann anschließend verwendet werden! Angenommen, die MyScript-Ausgabe wird in eine Datei namens MyScript_output umgeleitet
quelle