Manchmal muss ich Text schreiben und diesen dann in einen anderen Befehl umleiten. Mein üblicher Workflow sieht ungefähr so aus:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Ich finde das umständlich und versuche, Bash-Scripting zu lernen. Ich möchte den Prozess viel einfacher machen, indem ich einen Befehl schreibe, der einen Editor öffnet und wenn der Editor schließt, die Ausgabe des Editors an stdout weiterleitet. Dann könnte ich den Befehl als ausführen quickedit | pandoc -o file.pdf
.
Ich bin mir nicht sicher, wie das funktionieren würde. Ich habe bereits eine Funktion zur Automatisierung dieses Vorgangs geschrieben, indem ich den oben beschriebenen exakten Arbeitsablauf sowie einige Ergänzungen befolgt habe. Es generiert eine zufällige Zeichenfolge, die als Dateiname fungiert, und übergibt diese beim Aufruf der Funktion an vim. Wenn der Benutzer vim durch Speichern der Datei beendet, druckt die Funktion die Datei auf der Konsole und löscht sie dann.
function quickedit {
filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
vim $filename
cat $filename
rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal
Das Problem, auf das ich bald gestoßen bin, ist, dass ich so etwas wie quickedit | command
vim selbst nicht als Editor verwenden kann, weil die gesamte Ausgabe auf die Pipe beschränkt ist.
Ich frage mich, ob es irgendwelche Problemumgehungen gibt, damit ich die Ausgabe meiner quickedit
Funktion weiterleiten kann. Die suboptimale Alternative ist, einen separaten Editor zu starten, z. B. erhabenen Text, aber ich möchte wirklich im Terminal bleiben.
mktemp
anstatt es unsicher neu zu erfinden.
:w !pandoc -o file.pdf
? (Hinweis: Der Abstand zwischenw
und!
ist von wesentlicher Bedeutung.)