получение интерактивного многострочного форматированного ввода из stdin в bash

#bash #user-interface #stdin

#удар #пользовательский интерфейс #стандартный код #bash #stdin

Вопрос:

Я хочу иметь возможность интерактивно получать выходные данные с терминала способом, аналогичным hereDOC. Т.е. я хочу, чтобы пользователь мог вводить несколько строк, а затем передавать эту информацию в файл со всем сохраненным форматированием. Что-то вроде этого.

 echo  "Type your message below. To finish the letter type DONE by itself on a line"
file=mktmp
cat << DONE > $file
  

очевидно, что это не работает, потому что EOF найден до ЗАВЕРШЕНИЯ. Я думал о передаче пользователя чему-то вроде VIM, но моим менее разбирающимся в компьютерах коллегам сложно работать с vim / emacs / nano.

Комментарии:

1. Используйте $EDITOR , и ваши коллеги смогут настроить EDITOR=their-editor-of-choice .

2. Чтение непосредственно из стандартного ввода будет гораздо менее удобным для пользователя, чем в любом редакторе.

Ответ №1:

Вам нужно использовать редактор; стандартный ввод — это просто поток байтов, а не редактор. Однако вам не нужно жестко кодировать конкретный редактор. EDITOR это стандартная переменная среды, предназначенная для того, чтобы вызывающий ваш скрипт мог выбирать, какой редактор использовать.

 : ${EDITOR:?Please set the environment variable EDITOR to the editor of your choice}
echo "Type your message below, then save and exit your editor."
"$EDITOR" "$file"
  

EDITOR обычно устанавливается пользователем в файле конфигурации оболочки, но может быть установлен по требованию при запуске скрипта.

 $ EDITOR=nano yourScript.sh
  

Ответ №2:

хорошо, итак, я придумал это, но, пожалуйста, помогите мне найти что-то лучшее или усовершенствовать это.

 echo  "Type your message below, to finish the letter press CTL D"
mapfile message
file=`mktemp`
for x in `seq 0 ${#message[@]}`
        do printf "${message[$x]}" >> $file
done
cat $file