2017-12-21 4 views
0

Ich rman Befehle aus Bash-Skripte ausführen. Ich gebe meine Befehle an rman weiter, indem ich hier Dokumente verwende. Ich möchte die Ausgabe erfassen und gleichzeitig auf der Konsole ausgeben (Echtzeit). Ich habe diese Lösung gefunden, aber ich mache es nicht, um mit here-docs zu arbeiten.Bash Speichern Ergebnis eines Befehls in einer Variablen und drucken Sie es auf der Konsole während der Verwendung von hier Dokumente

VAR=$(ls | tee /dev/tty) 

Was ich zur Zeit laufen ist:

output=$(rman <<RMAN 
$rman_script 
RMAN 
) 

Wissen Sie, wie in diesem Beispiel RMAN ich auch auseinander stdout an die Konsole drucken könnte es in dem output Variable von der Speicherung? Jede Hilfe wird geschätzt. Prost.

+1

Dies sieht wie eine schlechte Passform für ein Bash-Skript aus. Vielleicht könnte etwas von der Hässlichkeit mit 'output = $ (echo" $ rman_script "| rman) umgestaltet werden, aber für mich führt das Sammeln von Eingaben in eine Bash-Variable bereits zu einem verdächtigen Geruch (und dazu auch das Skript in einer Variablen) Angelegenheit). – tripleee

+0

Ich denke, es gibt keine Wahl. Ich habe keinen Mechanismus gefunden, um RMAN-Fehler besser zu verarbeiten :(Die einzige Möglichkeit ist die Überprüfung der Ausgabe und des Rückgabecodes. Was ist daran schlimm, ein Skript in einer Variablen zu haben? Könnten Sie es erklären? Ich mache es immer so, bevor ich I ausführe kann einige Protokollnachrichten ausgeben echo "$ rman_script" ' – damian

+0

Diese Box ist zu klein für eine korrekte Darstellung, und ich lese ein bisschen zwischen den Zeilen in Ihrer Frage, aber ein häufiger Fehler ist es, Ergebnisse im Speicher über linear zu speichern und skalierbare Verarbeitung in einer Pipeline, die normalerweise die natürlichste Art in einem Shell-Skript ist – tripleee

Antwort

0
output=$(rman <<RMAN) 
$rman_script 
RMAN 

Beachten Sie, dass ein HERE-Dokument syntaktisch wie eine Eingabeumleitung aussieht, nur dass Sie << statt < haben. Die Eingabe wird aus den folgenden Zeilen übernommen.

+0

Das funktioniert nicht - 'Zeile 43: Warnung: Here-Dokument bei Zeile 43 abgegrenzt durch End- von-fil e (wollte 'RMAN ')' – damian

+0

Könnte es sein, dass du ein Zitat nach '' RMAN' geschrieben hast? Die Fehlermeldung besagt, dass nach "RMAN" und nicht nach "RMAN" gesucht wird. – user1934428

1

Das hier Dokument unterscheidet sich nicht von anderen Umleitungen, obwohl die Syntax natürlich etwas anders ist.

var=$(rman <<\... | tee /dev/stderr 
$rman_script 
... 
) 

Wenn dies ein Vertreter Schnipsel des Codes ist, könnte man genauso gut

var=$(rman <<<"$rman_script" | tee /dev/stderr) 

Übrigens, wenn Sie das Skript mehrere Male wirklich brauchen (warum halten sie auch in einer Variable?) vielleicht Refactoring in eine Funktion:

rman_script() { 
    rman <<\____HERE 
     Actual script 
     Probably multiple lines 
____HERE 
} 

var=$(rman_script | tee /dev/stderr) 

Sie werden bemerken, dass ich /dev/stderr statt /dev/tty verwenden. Ein Skript zu benötigen und zu mucken, sollte wahrscheinlich vermieden werden, es sei denn, Ihr Skript ist wirklich kurz und einfach und es macht nur Sinn, interaktiv zu verwenden (Passwort-Manipulation kommt mir als ein Szenario in den Sinn, wo es manchmal schwer zu vermeiden ist).

Verwandte Themen