Mir ist das source
(aka .
) Dienstprogramm bekannt, das den Inhalt aus einer Datei entnimmt und in der aktuellen Shell ausführt.
Jetzt wandle ich Text in Shell-Befehle um und führe sie dann wie folgt aus:
$ ls | sed ... | sh
ls
ist nur ein zufälliges Beispiel, der Originaltext kann alles sein. sed
Auch nur ein Beispiel für die Transformation von Text. Das Interessante ist sh
. Ich pfeife alles, was ich habe sh
und es läuft.
Mein Problem ist, dass ich eine neue Sub-Shell starten muss. Ich möchte lieber, dass die Befehle in meiner aktuellen Shell ausgeführt werden. Wie ich es tun könnte source some-file
, wenn ich die Befehle in einer Textdatei hätte.
Ich möchte keine temporäre Datei erstellen, da sie sich schmutzig anfühlt.
Alternativ möchte ich meine Sub-Shell mit genau den gleichen Eigenschaften wie meine aktuelle Shell starten.
aktualisieren
Ok, die Lösungen mit Backtick funktionieren sicherlich, aber ich muss dies oft tun, während ich die Ausgabe überprüfe und ändere. Daher würde ich es sehr bevorzugen, wenn es am Ende eine Möglichkeit gäbe, das Ergebnis in etwas umzuwandeln.
trauriges Update
Ah, das /dev/stdin
Ding sah so hübsch aus, aber in einem komplexeren Fall funktionierte es nicht.
Also, ich habe folgendes:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Dadurch wird sichergestellt .doc
, dass die Erweiterung aller Dateien in Kleinbuchstaben geschrieben ist.
Und was übrigens gehandhabt werden kann xargs
, aber das ist nicht der Punkt.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Wenn ich das erstere starte, wird es sofort beendet, nichts passiert.
Antworten:
UPDATE: Dies funktioniert in der Bash 4.0 sowie tcsh und Bindestrich (wenn Sie ändern
source
zu.
). Anscheinend war dies in Bash 3.2 fehlerhaft. Aus den Versionshinweisen zu Bash 4.0 :quelle
eval "$(sed ...)"
Ansatz zu gehen - aber danke für das 3.2 Bug Heads-Up!Der
eval
Befehl existiert genau zu diesem Zweck.Mehr aus dem Bash-Handbuch :
quelle
eval "$( ssh remote-host 'cat ~/.bash_profile' )"
Beachten Sie, dass ich tatsächlich bash 3.2 verwende.Wow, ich weiß, dass dies eine alte Frage ist, aber ich habe in letzter Zeit genau das gleiche Problem (so bin ich hierher gekommen).
Wie auch immer - ich mag die
source /dev/stdin
Antwort nicht, aber ich denke, ich habe eine bessere gefunden. Eigentlich ist es täuschend einfach:Schön, oder? Tatsächlich macht dies immer noch nicht das, was Sie wollen, denn wenn Sie mehrere Zeilen haben, werden diese zu einem einzigen Befehl zusammengefasst, anstatt jeden Befehl einzeln auszuführen. Die Lösung, die ich gefunden habe, ist:
Die
-L 1
Option bedeutet, dass Sie (höchstens) 1 Zeile pro Befehlsausführung verwenden. Hinweis: Wenn Ihre Zeile mit einem Leerzeichen endet, wird sie mit der nächsten Zeile verkettet! Stellen Sie also sicher, dass jede Zeile mit einem Leerzeichen endet.Endlich können Sie tun
um zu sehen, welche Befehle ausgeführt werden (-t ist ausführlich).
Hoffe jemand liest das!
quelle
Versuchen Sie, die Prozessersetzung zu verwenden , bei der die Ausgabe eines Befehls durch eine temporäre Datei ersetzt wird, die dann bezogen werden kann:
quelle
echo <(echo id)
die Ausgabe gibt/dev/fd/12
(12 ist ein Beispiel),cat <(echo id)
die Ausgabeid
gibt und dannsource <(echo id)
die gleiche Ausgabe wie beim einfachen Schreiben gibtid
(...)
umgeleitete Subshell ist ?Ich glaube, das ist "die richtige Antwort" auf die Frage:
Das heißt, man kann in eine
while
Schleife pfeifen; Derread
Befehl befiehlt eine Zeile von seinerstdin
und weist sie der Variablen zu$line
.$line
wird dann der Befehl, der innerhalb der Schleife ausgeführt wird; und es wird fortgesetzt, bis keine weiteren Zeilen in seiner Eingabe vorhanden sind.Dies funktioniert bei einigen Kontrollstrukturen (wie einer anderen Schleife) immer noch nicht, passt aber in diesem Fall zur Rechnung.
quelle
Ich Art von Gefühl wie
ls | sed ... | source -
wäre schöner, aber leidersource
nicht verstehen ,-
zu verstehenstdin
.quelle
Ich denke, Ihre Lösung ist die Befehlssubstitution durch Backticks: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html
Siehe Abschnitt 3.4.5
quelle
$( )
möglicherweise die Syntax bevorzugt. 'Kurs Backticks arbeiten in mehr Muscheln ...Um die mark4o-Lösung für bash 3.2 (macos) zu verwenden, kann anstelle von Pipelines wie in diesem Beispiel eine Here-Zeichenfolge verwendet werden:
quelle
Warum dann nicht verwenden
source
?quelle