Иногда мне нужно написать текст, а затем передать этот текст в другую команду. Мой обычный рабочий процесс выглядит примерно так:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Я нахожу это громоздким и пытаюсь изучить bash-скрипты, и я хотел бы сделать этот процесс намного проще, написав команду, которая запускает редактор и когда редактор закрывает канал, выводит его в stdout. Тогда я смогу выполнить команду как quickedit | pandoc -o file.pdf
.
Я не уверен, как это будет работать. Я уже написал функцию для автоматизации этого, следуя точному рабочему процессу, указанному выше, плюс некоторые дополнения. Он генерирует случайную строку в качестве имени файла и передает ее в vim при вызове функции. Когда пользователь выходит из vim, сохраняя файл, функция выводит файл на консоль, а затем удаляет файл.
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
Проблема, с которой я вскоре столкнулся, заключается в том, что когда я делаю что-то вроде quickedit | command
самого vim, его нельзя использовать в качестве редактора, потому что весь вывод ограничен каналом.
Мне интересно, есть ли какие-нибудь обходные пути к этому, чтобы я мог передать вывод своей quickedit
функции. Неоптимальной альтернативой является запуск отдельного редактора, скажем, возвышенного текста, но я действительно хочу остаться в терминале.
mktemp
а не изобретать его небезопасным способом.
:w !pandoc -o file.pdf
? (Примечание: пробел междуw
и!
является существенным.)