Іноді мені потрібно написати текст, а потім передати цей текст в іншу команду. Мій звичайний робочий процес йде приблизно так:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Я вважаю це громіздким і прагну навчитись баш сценаріїв, я хотів би зробити процес набагато простішим, написавши команду, яка запускає редактор і коли редактор закриває трубку вихід редактора в 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
і!
є істотним.)