Wie kann ich über die Befehlszeile eine Datei mit mehreren Zeilen erstellen?

Wie kann ich über die Befehlszeile eine Datei mit mehreren Zeilen erstellen?

Wie kann ich folgende Inhalte in eine Datei eintragen:

Hi
abcd

Ich habe versucht, zu verwenden echo "Hi\nabcd" >> ab.txt, aber in der Datei steht es so, wie es ist (das \nist anstelle einer neuen Zeile eingefügt).

Antwort1

Sie müssen angeben, echodass Escape-Sequenzen beachtet werden sollen.

echo -e "Hi\nabcd" >> ab.txt

Antwort2

Das Verhalten vonechovariiert von Schale zu Schale¹;printfDas Verhalten von ist eher standardmäßig.

printf "Hi\nabcd" >> ab.txt

¹ „Es ist nicht möglich,Echoportabel auf allen POSIX-Systemen, es sei denn, beide-N(als erstes Argument) und Escape-Sequenzen werden weggelassen."

Antwort3

Ich würde vorschlagen,Bash-Shell-Funktion namensHier Dokument. Scheint die eleganteste Form zu sein, um das zu erreichen, was Sie beschreiben. Am wichtigsten ist, dass der mehrzeilige Inhalt genauso aussieht, wie Sie ihn in der Ausgabedatei haben würden (im Gegensatz zu unlesbaren, langen, \ngetrennten Zeichenfolgen).

cat > ab.txt <<EOL
Hi
abcd
EOL

Hier EOList der Marker, der angibt, wonach die Shell suchen soll, um das Ende deshier Dokument. Sie können ein Wort beliebig auswählen, das Ihnen erlaubt, etwas zu wählen, das nicht zufällig mit dem kollidierthier Dokument's Inhalt selbst. Das Schöne ist, dass Sie eine Shell haben könnten ${VARIABLES}, die ersetzt wird. Wenn das irgendwie unerwünscht ist, können Sie das öffnende (nur das öffnende!) Markierungswort immer in Anführungszeichen ( ') setzen, um dies zu verhindern.

Ich persönlich verwende dies häufig in den Init-Skripten, um beim Einrichten meiner Umgebung kleine Konfigurationsdateien zu erstellen, etwa so:

cat > ~/.screenrc <<END_OF_HEREDOC_MARKER
defscrollback ${MAX_LINES}
END_OF_HEREDOC_MARKER

Antwort4

Mit Zitaten kann man auch spielen:

 % echo 'Hi
> abcd' >> ab.txt

Sie geben das in Bash ein, indem Sie nach „Hi“ die Eingabetaste drücken. Bash verwendet für mich „>“ als Eingabeaufforderung zur Fortsetzung des Befehls. Aus irgendeinem Grund konnte ich einer einzelnen Eingabe nicht mit einem Backslash entkommen.

verwandte Informationen