Мне просто интересно, есть ли способ получить ввод не из, StdIn
а из $EDITOR
- будь то vim, nano, emacs или даже редактор, не являющийся командной строкой (MacVim/TextMate). Каковы варианты/обходные пути/лучшие практики?
По сути, я бы хотел иметь такой же рабочий процесс heredoc
, но из $editor.
$ sort -nr << FOO | uniq -c
pipe heredoc> foo
pipe heredoc> bar
pipe heredoc> baz
pipe heredoc> foo
pipe heredoc> FOO
2 foo
1 baz
1 bar
решение1
Команда vipe
в пакетеmoreutilsпозволяет вам запускать $EDITOR в середине конвейера.
Вы можете получить желаемое поведение следующим образом:
$ </dev/null vipe |sort -nr | uniq -c
решение2
Думаю, единственный шанс заставить его работать с любым редактором — это использовать временные файлы:
FILE=$(mktemp); $EDITOR "$FILE"; <"$FILE" …command… ; rm "$FILE"
(Однако это не позволяет запустить команду до тех пор, пока не будет предоставлен полный ввод.)
Также вы можете использовать echo "# please insert your input bellow" >"$FILE"
перед вызовом to $EDITOR
для вставки комментария, который будет отображаться внутри редактора. Убедитесь, что он не повлияет на поведение команды (или попросите пользователя явно удалить его).
решение3
Emacs имеет возможность запустить оболочку в одном из своих буферов (используйте оболочку MX). Но запущенные процессы все равно будут получать входные данные из stdin, их stdin будет просто псевдотерминалом, другим концом которого будет emacs.
решение4
В Emacs вы можете выполнить любую команду и предоставить содержимое одного из буферов Emacs (точнее, выбранной области) в качестве стандартного ввода для приложения.
Например, если содержимое вашего буфера Emacs будет ls
и вы пометите его как область (используя C-SPC
), затем запустите shell-command-on-region
( M-|
) и введите команду bash
(полная комбинация: M-| command RET
), она будет ls
выполнена bash
, а вывод будет открыт как новый буфер.
Если вы используете C-u M-| command RET
on region, вывод заменит отмеченную команду в вашем текущем буфере.