Ich habe eine Bash-Funktion, die eine Datei als Parameter verwendet, überprüft, ob die Datei vorhanden ist, und dann alles, was von stdin kommt, in die Datei schreibt. Die naive Lösung funktioniert gut für Text, aber ich habe Probleme mit beliebigen Binärdaten.
echo -n '' >| "$file" #Truncate the file
while read lines
do # Is there a better way to do this? I would like one...
echo $lines >> "$file"
done
> $file
. Dies funktioniert nur als erstes, das im übergeordneten Shell-Skript nach stdin sucht. Grundsätzlich kann der gesamte Code von David auf ein einziges Zeichen reduziert werden, aber ich denke, dascat -
ist eleganter und weniger problematisch, weil es auf Anhieb verstanden wird.cat
cat
nur, damit Leute, die darauf bestehen, sie zu verwenden, unbedingt mental turnen müssen, um den Code zu lesen. Named Pipes sind auch gute Ziele.Um eine Textdatei buchstäblich zu lesen, verwenden Sie nicht plain
read
, da dies die Ausgabe auf zwei Arten verarbeitet:read
interpretiert\
als Fluchtzeichen; Verwenden Sieread -r
, um dies auszuschalten.read
teilt sich in Wörter auf Zeichen in$IFS
; Stellen SieIFS
eine leere Zeichenfolge ein, um dies zu deaktivieren.Die übliche Sprache, um eine Textdatei zeilenweise zu verarbeiten, ist
Eine Erklärung dieser Redewendung finden Sie unter Warum wird
while IFS= read
so oft anstelle von verwendetIFS=; while read..
?. .Um eine Zeichenfolge wörtlich zu schreiben, verwenden Sie nicht nur plain
echo
, sondern verarbeiten die Zeichenfolge auf zwei Arten:echo
Backslash auf. (Bei Bash hängt es davon ab, ob diexpg_echo
Option aktiviert ist.)-n
oder-e
(die genaue Menge hängt von der Shell ab).Ein portabler Weg, eine Zeichenkette buchstäblich zu drucken, ist mit
printf
. (Es gibt keinen besseren Weg in bash, es sei denn, Sie wissen, dass Ihre Eingabe nicht wie eine Option für aussiehtecho
.) Verwenden Sie das erste Formular, um die genaue Zeichenfolge zu drucken, und das zweite Formular, wenn Sie eine neue Zeile hinzufügen möchten.Dies ist nur geeignet für die Verarbeitung von Text , denn:
Sie können keine Binärdaten in der Shell verarbeiten, aber moderne Versionen von Dienstprogrammen auf den meisten Unices können mit beliebigen Daten umgehen. Verwenden Sie, um alle Eingaben an die Ausgabe weiterzuleiten
cat
. Sich auf eine Tangente zu begeben,echo -n ''
ist eine komplizierte und nicht tragbare Art, nichts zu tun.echo -n
wäre genauso gut (oder nicht abhängig von der Shell), und:
ist einfacher und vollständig portabel.oder einfacher
In einem Skript müssen Sie normalerweise nicht verwenden,
>|
danoclobber
es standardmäßig deaktiviert ist.quelle
Dies wird genau das tun, was Sie wollen:
Beachten Sie jedoch die Speichernutzung. Dies liest die Eingabe in einer durch Nullen getrennten Weise.
Wenn die Eingabe keine
\0
Null- Bytes enthält, muss die Bash zuerst den gesamten Inhalt der Eingabe in den Speicher lesen und dann ausgeben.In Bezug auf Ihren abgeschnittenen Schritt:
Ein viel einfacheres und gleichwertiges ist:
quelle