Solo tenía curiosidad por saber si hay una manera de obtener información no de StdIn
sino de $EDITOR
, ya sea vim, nano, emacs o incluso un editor que no sea de línea de comandos (MacVim/TextMate). ¿Cuáles son las opciones/soluciones/mejores prácticas?
Básicamente, desearía un flujo de trabajo como heredoc
el de $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
Respuesta1
El comando vipe
en el paquete.másutilsle permite iniciar $EDITOR en medio de una canalización.
Puede obtener el comportamiento deseado de esta manera:
$ </dev/null vipe |sort -nr | uniq -c
Respuesta2
Supongo que tu única posibilidad de hacerlo funcionar con cualquier tipo de editor es utilizar archivos temporales:
FILE=$(mktemp); $EDITOR "$FILE"; <"$FILE" …command… ; rm "$FILE"
(Sin embargo, esto no permite iniciar el comando antes de que se proporcione una entrada completa).
También puedes usarlo echo "# please insert your input bellow" >"$FILE"
antes de la llamada para $EDITOR
insertar un comentario que aparecerá dentro del editor. Asegúrese de que no afecte el comportamiento del comando (o solicite al usuario que lo elimine explícitamente).
Respuesta3
Emacs tiene la posibilidad de ejecutar el shell en uno de sus búfer (use el shell MX). Pero los procesos iniciados aún recibirían su entrada de la entrada estándar, su entrada estándar sería simplemente una pseudoterminal cuyo otro extremo sería emacs.
Respuesta4
En Emacs puede ejecutar cualquier comando y proporcionar el contenido de uno de los buffers de Emacs (región seleccionada para ser exactos) como entrada estándar para la aplicación.
Por ejemplo, si el contenido de su búfer de Emacs será ls
y lo marca como región (usando C-SPC
), ejecute shell-command-on-region
( M-|
) y escriba como comando bash
(combinación completa M-| command RET
:) allí se ejecutará ls
y bash
la salida se abrirá como un nuevo búfer.
Si usa C-u M-| command RET
una región, la salida reemplazará el comando marcado en su búfer actual.