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.