Versuch, ein kleines Skript zu erstellen, mit dem ein Teil ohne Änderungen in der Ausgabedatei aus dem Skript geschrieben werden kann (wie es ist)
text der Quelldatei
echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt
Gewünschte Leistung:
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
Was ich bekomme ist:
yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&
Mit CentOS 7 Minimal fresh install Wenn Sie nach einer Lösung suchen, die auf das gesamte Skript/den gesamten Text angewendet werden kann, ändert sich die Zeile pro Zeile nicht. Ich denke, dass auch sed verwendet werden kann ...
Sie müssen den Backticks entkommen (`):
#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt
Ich bevorzuge diese Methode für mehrzeilige:
#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
Verwenden Sie ein einfaches Anführungszeichen, um Erweiterungen zu verhindern:
echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt
Weitere Informationen finden Sie unter Unterschied zwischen Doppel- und Einfachzitat .
Wenn Ihr Text ein einfaches Anführungszeichen enthält, funktioniert das obige nicht. In diesem Fall wäre die Verwendung von hier doc sicherer. Zum Beispiel wird das Obige unterbrochen, wenn Sie eine Zeile einfügen: var='something'
.
Bei Verwendung eines Here-Dokuments wird es so aussehen:
cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
Nur eine späte Ergänzung:
Der Befehlecho 'string' >> output
ist einfach und großartig. Möglicherweise erhalten Sie jedoch die Fehlermeldung "...: Permission denied" in Kombination mit Sudo
.
Ich hatte kürzlich ein kleines Problem mit Sudo echo 'string \n other string \n' > /path/to/file
Was für mich am besten funktioniert hat:printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file
Es ist ein Extra, dass Sie die Zeichenkette tatsächlich auch in stdout drucken lassen, damit Sie sehen, was in die Datei geschrieben wurde.
Danke an chepner
Die beste Lösung, die ich gefunden habe, ist:
echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output
Bei dieser Lösung wird der gesamte Text ohne Änderungen in die Ausgabedatei übertragen. Auch Farbdefinitionen funktionieren ohne Änderungen.