2012-06-08 14 views
15

Der Anwendungsfall ist in meinem Fall CSS-Dateiverkettung, bevor sie minimiert wird. Um concat zwei CSS-Dateien:Verketten von Strings, Dateien und Programmausgaben in Bash

cat 1.css 2.css > out.css 

Um einen Text in einer einzigen Position hinzufügen, kann ich

cat 1.css <<SOMESTUFF 2.css > out.css 
This will end in the middle. 
SOMESTUFF 

zu STDOUT von ein anderes Programm hinzufügen:

sed 's/foo/bar/g' 3.css | cat 1.css - 2.css > out.css 

So weit so gut. Aber ich komme regelmäßig in Situationen, in denen ich mehrere Strings, Dateien und sogar Programmausgabe zusammen mischen muss, wie Copyright-Header, Dateien vorverarbeitet von sed(1) und so weiter. Ich möchte sie in möglichst kleinen Schritten und temporären Dateien zusammenfügen und gleichzeitig die Freiheit haben, den Auftrag zu wählen.

Kurz gesagt, ich bin nach einem Weg, dies in so wenig Schritten wie möglich in Bash zu tun:

command [string|file|output]+ > concatenated 
# note the plus ;-) --------^ 

(Im Grunde genommen ein cat mit mehreren STDINs zu handhaben würde ausreichen, ich denke, wie

<(echo "FOO") <(sed ...) <(echo "BAR") cat 1.css -echo1- -sed- 2.css -echo2- 

Aber ich scheitern zu sehen, wie ich auf diese zugreifen)

Antwort

23

Dies funktioniert:

cat 1.css <(echo "FOO") <(sed ...) 2.css <(echo "BAR") 
+0

D'oh! Das ist die einfachste Lösung (in meinem Fall), also werde ich das akzeptieren. – Boldewyn

+1

Natürlich muss @Boldewyn '> concatenated.css' oder' | hinzugefügt haben Compiler 'am Ende für sein Problem wie folgt zu arbeiten:' cat file1.css <(echo "FOO") <(Befehl [Zeichenfolge | Datei | Ausgabe]) file2.css <(Echo "BAR")> verkettet ' – hobs

12

Sie tun können:.

echo "$(command 1)" "$(command 2)" ... "$(command n)" > outputFile 
+0

Sie müssen diese Befehlsersetzungen zitieren Leerzeichen zu erhalten. –

+0

@DennisWilliamson: Danke. Ich habe meine Antwort korrigiert. – nhahtdh

16

Sie können alle Befehle in einer Subshell hinzufügen, die in eine Datei umgeleitet wird:

(
    cat 1.css 
    echo "FOO" 
    sed ... 
    echo BAR 
    cat 2.css 
) > output 

Sie auch in eine Datei mit >> anhängen können. Zum Beispiel:

cat 1.css > output 
echo "FOO" >> output 
sed ... >> output 
echo "BAR" >> output 
cat 2.css >> output 

(Dies öffnet potenziell und schließt die Datei wiederholt)

+0

Sie können einen geschweiften Klammerblock verwenden, um das Gleiche zu tun. –

+0

Danke. Ja, das würde es tun, diese Option komplett verpasst. +1. – Boldewyn

+0

Wenn ich mich nicht irre, ist() POSIX-kompatibel, während Befehlsersetzung eine Bash-Erweiterung ist, die in Cygwin Bash bis ca. 2008 nicht implementiert wurde. – Leo