bash - guardar - Después de hacer grep y pasarlo a vim luego de salir, ¿por qué estoy experimentando esta extraña consola funcionando mal?
salir de vi linux (6)
Desde la página man para xargs
:
Undefined behavior may occur if utility reads from the standard input.
Esa línea no está en la página man de Linux, pero está presente en mi Mac. Si desea ejecutar un programa que tiene la intención de leer la entrada estándar, la versión habitual de Linux de xargs necesitará un argumento para leer su entrada de un archivo:
OPTIONS
--arg-file=file, -a file
Read items from file instead of standard input.
If you use this option, stdin remains unchanged
when commands are run. Otherwise, stdin is
redirected from /dev/null.
Vim está diseñado para funcionar con entrada estándar y salida estándar conectada a dispositivos reales (un caso muy raro en la actualidad) o pseudo tty. Cosas extrañas sucederán si trastorna este arreglo.
El problema fundamental con su comando era que, con la entrada estándar redirigida a la tubería, xargs no tenía manera de ejecutar un vim con una entrada estándar "normal". Entonces, el modo vim cambia y la entrada de comando no fue lo que esperabas.
Probablemente pueda solucionar esto escribiendo una declaración, una tilde y un punto. Esto forzará tu sesión de ssh cerrada desde tu final, puedes volver a ingresar y ejecutar "ps" para verificar si hay algo colgado en el fondo que deberías matar (1).
Intenté esto ahora mismo
grep -RlI "id=/"kw/"" * | xargs vim
Eso me dio 16 resultados. Abrió el primer resultado en Vim. Hice mi primera edición y pulsé :q
ya que no sabía el atajo para saltar al siguiente archivo.
Me devolvió a la consola (estoy SSHed en un servidor). Mi consola está en mal estado ahora. Cualquier cosa que escriba no puedo ver, y cada vez que presiono enter, parece que procesa el comando, pero la pantalla / vista está estropeada, por lo que
[meder@linode]
aparece en mi consola, al menos a medio camino. reset
no hace nada ya que parece haber arruinado mi consola real.
¿Alguien puede ofrecer una solución que no tenga la misma desventaja? ¿O alguien puede dar una explicación de por qué :q
¿ :q
el primer archivo arruinó mi consola?
Información general : Mi PC es Debian Ubuntu, estoy SSHed en una caja RHEL. Los archivos que abrí fueron archivos text / ascii archivos phtml / php y no algunos archivos binarios raros con personajes locos en ellos.
Aquí hay una captura de pantalla de lo que sucedió
EDIT # 1: Acabo de escribir reset
nuevamente y pareció funcionar. El primer reset
no funcionó, creo, porque de alguna manera la consola insertó un carácter de espacio en blanco dentro de él. De todos modos, me gustaría una explicación para este extraño comportamiento.
Las opciones de la consola se establecen por stty
, por lo que es posible que desee guardar sus opciones en una variable bash y restaurarlas después de que vim finalice, como esta:
function vim()
{
STTYOPTS="$(stty --save)"
vim "$@"
stty "${STTYOPTS}"
}
Pero probablemente sea la mejor manera de usar zsh para esta tarea: si coloca la única línea ttyctl -f
en su ~/.zshrc
, entonces zsh restaurará automáticamente las opciones de terminal después de que el programa salga. ttyctl
es un zsh incorporado, por lo que no puedes usarlo desde bash.
Puede usar :next
o :n
para ir al siguiente archivo para editar. También puede usar vim -o
para abrir todos los archivos coincidentes en diferentes ventanas en Vim.
Sin embargo, no estoy seguro de por qué su consola está en mal estado. Intenté usar tu comando y mi consola estaba bien.
Tratar:
vim -o `grep -RlI "id=/"kw/"" * `
Intenta usar ... | xargs sh -c ''...''
... | xargs sh -c ''...''
y luego leer desde el dispositivo terminal de control /dev/tty
.
echo ~/.profile ~/.bashrc | xargs sh -c ''vim "$@" </dev/tty'' dummy_script_name
# based on a tip by Laszlo Ersek on http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2010-03/msg00051.html
#find . -maxdepth 1 -type f | xargs sh -c ''rm -i "$@" </dev/tty'' dummy_script_name
Otras personas cubrieron lo que sucedió y qué hacer al respecto. En cuanto a por qué, la respuesta a eso probablemente se encuentra en la entrada que Vim recibió del comando xargs y trató de ejecutar como si esa entrada proviniera de un terminal. No sé cómo hablar terminal, pero se puede imaginar que Vim recibió comandos extraños que lo bloquearon o le dijeron que abandonara. De manera similar, suceden cosas impredecibles cuando adquieres un archivo binario.
Anway, tengo otra idea. ¿Has probado usar vimgrep para navegar por una lista de archivos que coinciden con un patrón?
:vimgrep /id="kw"/ *
:copen
Esto greps para id="kw"
en todos los archivos en el directorio actual. :copen
abre una ventana con una lista de coincidencias. Puede navegar por esa lista, hacer clic en ingresar para saltar a una posición de archivo.
Para más información, ver
:help grep
:help :vimgrep
:help :copen
:help quickfix
Si realmente necesitas esa opción -I
, mira
:help :grep
:help ''grepprg''
Ver también: Vim: Advertencia: la entrada no es desde un terminal