Ich mag die umgekehrte polnische Schreibweise, wenn ich nur mit Pfeifen schreibe. Ich codiere viel schneller und die Qualität / Geschwindigkeit der Codes ist nicht so wichtig. Außerdem ist es beim Verketten nicht einfacher, Teile der Kette
auszukommentieren
Wenn Sie Bedenken haben, wie einfach das Debuggen ist, sollten Sie den Befehl backticks in mehrere separate Zeilen einteilen. A=$( some | command | here )mit jedem von some |, command |und herein einer eigenen Zeile.
Sollte zwischen IFS=und kein Leerzeichen sein read?
Caesarsol
Alles Hagel letzte Pfeife. Außerdem wird das Randnotenset + m (ermmm oder -m) über eine Befehlszeile benötigt, da die letzte Pipe bei aktivierter Jobsteuerung nicht funktioniert.
MageProspero
17
Sie könnten so etwas tun, wenn Sie verwenden bash:
echo cart |while read spo;do echo $spo;done
Leider existiert die Variable "spo" nicht außerhalb der while-do-done-Schleife. Wenn Sie in der while-Schleife das erledigen können, was Sie wollen, funktioniert das.
Sie können tatsächlich fast genau das tun, was Sie oben in ATT ksh (nicht in pdksh oder mksh) oder im fabelhaften zsh geschrieben haben:
% echo cart | read spo
% echo $spo
cart
Eine andere Lösung wäre also, ksh oder zsh zu verwenden.
Sie können Koprozesse in der Korn-Shell verwenden (zB mksh): echo cart |& while read -p spo; do echo $spo; done(eigentlich besser zu verwenden while IFS= read -p -r spo; do…)
mirabilos
2
Wenn ich das Problem richtig verstehe, möchten Sie stdout an eine Variable weiterleiten. Zumindest habe ich das gesucht und bin hier gelandet. Also für diejenigen, die mein Schicksal teilen:
Warum sollten Sie die Ausgabe an eine Ebene weiterleiten cat?
Roaima
1
@roaima Einige Befehle erkennen, dass sie auf einem Terminal ausgeführt werden, und verhalten sich anders, als wenn sie auf einer Pipe ausgegeben werden. Insbesondere können sie Linien auf die aktuelle Bildschirmbreite kürzen. Für die meisten Befehle ist der Befehl cat überflüssig.
BillThor
Ah ok, ich verstehe jetzt, was Sie versuchen zu veranschaulichen. Das echo | catKonstrukt hat mich geworfen.
Roaima
1
Hier ist meine Lösung für das Problem.
# assign will take last line of stdout and create an environment variable from it# notes: a.) we avoid functions so that we can write to the current environment# b.) aliases don't take arguments, but we write this so that the "argument" appears# behind the alias, making it appear as though it is taking one, which in turn# becomes an actual argument into the temporary script T2.# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
A=$( some | command | here )
mit jedem vonsome |
,command |
undhere
in einer eigenen Zeile.Antworten:
Würde funktionieren (speichere die Ausgabe
echo
ohne das nachfolgende Newline-Zeichen in derspo
Variablen), solangeecho
nur eine Zeile ausgegeben wird.Sie könnten immer tun:
Die folgenden Lösungen würden in
bash
Skripten funktionieren , jedoch nicht an derbash
Eingabeaufforderung:Oder:
Speichern der Ausgabe von
whatever
bis zu den ersten NUL-Zeichen (bash
Variablen können ohnehin keine NUL-Zeichen speichern) in$spo
.Oder:
um die Ausgabe von
whatever
im$spo
Array zu speichern (eine Zeile pro Array-Element).quelle
IFS=
und kein Leerzeichen seinread
?Sie könnten so etwas tun, wenn Sie verwenden
bash
:Leider existiert die Variable "spo" nicht außerhalb der while-do-done-Schleife. Wenn Sie in der while-Schleife das erledigen können, was Sie wollen, funktioniert das.
Sie können tatsächlich fast genau das tun, was Sie oben in ATT ksh (nicht in pdksh oder mksh) oder im fabelhaften zsh geschrieben haben:
Eine andere Lösung wäre also, ksh oder zsh zu verwenden.
quelle
mksh
):echo cart |& while read -p spo; do echo $spo; done
(eigentlich besser zu verwendenwhile IFS= read -p -r spo; do…
)Wenn ich das Problem richtig verstehe, möchten Sie stdout an eine Variable weiterleiten. Zumindest habe ich das gesucht und bin hier gelandet. Also für diejenigen, die mein Schicksal teilen:
Weist
cart
der Variablen zu$spa
.quelle
Wenn Sie nur den aktuellen Pipe-Stream ausgeben möchten, verwenden Sie
cat
.Wenn Sie Ihre Befehlskette fortsetzen möchten, verwenden Sie den Befehl, um
tee
die Ausgabe zu wiederholen.Sie können einen Alias verwenden, um den Befehl zu verkürzen.
quelle
cat
?echo | cat
Konstrukt hat mich geworfen.Hier ist meine Lösung für das Problem.
quelle