Ich schreibe oft KSH-Shell-Skripte, die dem gleichen Muster folgen:
- (1) Abrufen der Ausgabe von einem oder mehreren Befehlen
- (2) Formatieren Sie es mit grep | cut | awk | sed und drucken Sie es auf dem Bildschirm oder in einer Datei aus
Zu diesem Zweck speichere ich häufig die Ausgabe von (1) in einer temporären Datei und formatiere sie dann in (2) für diese Datei.
Nehmen Sie diesen Code zum Beispiel:
TMPFILE=file.tmp
# If tmpfile exists rm it.
[ -f $TMPFILE ] && rm -f $TMPFILE
for SERVICE in $(myfunc); do
getInfo $SERVICE > $TMPFILE # Store raw output in the TMPFILE
# I retrieve the relevant data from the TMPFILE
SERV_NAME=$(head -1 $TMPFILE | sed -e 's/ $//')
SERV_HOSTNAME=$(grep HOSTNAME $TMPFILE | cut -d "=" -f2)
SERV_ARGS=$(grep Arguments $TMPFILE | cut -d ":" -f2)
print $SERV_NAME $SEP $SERV_HOSTNAME $SEP $SERV_ARGS
rm -f $TMPFILE #rm the TMPFILE in vue of next iteration
done
Gibt es eine Möglichkeit, mithilfe von Pipes, Umleitungen und Dingsbums zu vermeiden, dass jedes Mal eine Datei auf die Festplatte geschrieben wird?
Wenn es hilft, verwende ich ksh Version M-11/16 / 88i
PATH
oder andere Shell- oder Umgebungsvariablen überlastet werden.TMPFILE
mag in Ordnung sein, ist aber etwasTMPDIR
Besonderes. Möchtest du wirklich diese Gratwanderung machen?Antworten:
Ihr Code scheint mir ein völlig gerechtfertigtes Beispiel für die Verwendung von Tempfiles zu sein. Ich würde bleiben: bleib bei diesem Ansatz. Das einzige, was wirklich geändert werden muss, ist die Art und Weise, wie Sie das Tempfile erstellen. Verwenden Sie so etwas wie
oder
oder zumindest
Auf diese Weise können Sie nicht zulassen, dass der Name leicht vorhergesagt wird (Sicherheit) und Interferenzen zwischen mehreren Instanzen des Skripts, die gleichzeitig ausgeführt werden, ausgeschlossen werden.
quelle
var=$(echo lots of spaces); echo "$var"
ist in Ordnung und solltelots of spaces
als Ausgabe produzieren. Die wirkliche Einschränkung, die niemand erwähnt hat, ist, dass die Befehlsersetzung alle nachfolgenden Zeilenumbrüche entfernt. Dies ist hier kein Problem und nur dann von Bedeutung, wenn Sie einenmktemp
Fehler hatten , der Dateinamen mit nachgestellten Zeilenumbrüchen erstellt hat. Die übliche Umgehung, falls erforderlich, istvar=$(echo command with trailing newline; echo x); var=${var%x}
.Sie könnten eine Variable verwenden:
Von
man ksh
:Zu den Vorteilen gehören:
quelle
man
Seite überprüft (es gab keine Erwähnung der Versionsnummer auf der Webseite: /)<<<
ist bash 'hier string'. Ich glaube nicht, dass es in einer anderen Shell erscheint. (Oh,zsh
vielleicht ...)man ksh
. Es wurde dort sicherlich erwähnt.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- Ja, es wird ein Tempfile verwendet.Sie haben zwei Möglichkeiten:
Sie rufen die Daten einmal ab (in Ihrem Beispiel mit
getInfo
) und speichern sie wie Sie in einer Datei.Sie rufen die Daten jedes Mal ab und speichern sie nicht lokal, dh Sie rufen
getInfo
jedes Mal anIch sehe das Problem beim Erstellen einer temporären Datei nicht, um ein erneutes Verarbeiten / Abrufen zu vermeiden.
Wenn Sie befürchten, die temporäre Datei irgendwo zu belassen, können Sie sie jederzeit
trap
löschen, falls das Skript beendet / unterbrochen wirdund verwenden Sie
mktemp
, um einen eindeutigen Dateinamen für Ihre temporäre Datei zu erstellen.quelle
Anstatt eine Datei zu generieren, erstellen Sie Shell-Zuweisungsanweisungen und werten Sie diese Ausgabe aus.
Oder wenn Sie nur die Informationen drucken möchten:
quelle