scripts script resueltos paso pasar parametros hacer español ejercicios ejemplos como vim shell emacs tcsh

vim - paso - scripts linux ejercicios resueltos



¿Cómo ejecuto un editor desde un script de shell? (7)

Me gustaría que mi script tcsh inicie un editor (por ejemplo, vi, emacs):

#!/bin/tcsh vi my_file

Esto inicia vi con my_file pero primero muestra una advertencia "Vim: advertencia: la salida no está en un terminal" y mis pulsaciones de teclas no aparecen en la pantalla. Después de matar a vi, mi ventana de terminal está en mal estado (sin líneas nuevas), que requiere un "reinicio". Intenté "emacs -nw", "xemacs -nw" y pico con resultados similares. "xemacs" funciona pero inicia una ventana separada. Quiero reutilizar la misma ventana de terminal.

¿Hay alguna manera de lanzar un editor desde un script para que reutilice la misma ventana de terminal?


¡Respondí mi propia pregunta! Debe redirigir la entrada y salida del terminal:

#!/bin/tcsh vi my_file < `tty` > `tty`


Absolutamente. :-)

Escriba su secuencia de comandos y haga que llame a la variable de entorno EDITOR, que habrá configurado como "emacsclient". Luego, inicie Emacs, ejecute Mx server-start , cambie a un buffer de shell ( Mx shell ) y ejecute su script. Emacsclient mostrará la cosa que se va a editar y Cx # actuará como un comando "hecho" y lo llevará de vuelta a su secuencia de comandos con las ediciones completadas o canceladas, según lo desee.

Disfrutar.

Editar: Quise agregar que actualmente Emacs ES mi programa de terminal. Tengo docenas de búferes de shell y nunca tengo que preocuparme por perder resultados y puedo usar toda la potencia de Emacs para manipular y analizar la salida del terminal. Y los scripts de Emacs generan entradas para los shells. Impresionante en realidad. Por ejemplo, ver la salida de Tomcat desplazarse por un buffer de caparazón mientras se editan las fuentes o procesar el correo o hacer casi cualquier cosa de Emacs es muy conveniente. Cuando aparece un rastro de la pila Tomcat, puedo responder rápidamente.


La razón por la que recibe el error es que cuando inicia un shell en su entorno, se inicia en una subshell que tiene STDIN y STDOUT no conectados a un TTY, probablemente porque se trata de algo así como una tubería. Cuando redirige, está abriendo una nueva conexión directamente al dispositivo. Entonces, por ejemplo, su línea de comando gira

$ vi < `tty` > `tty`

dentro

$ vi < /dev/ttys000 > /dev/ttys000

Entonces, realmente no está usando su viejo STDIN / STDOUT, está creando dos nuevos archivos y asignándolos al STDIN / STDOUT de su proceso vi.

Ahora, cuéntanos qué estás haciendo con esto y te diremos cómo evitar este kludge.


Pude obtener el comportamiento deseado bajo bash + Cygwin + Terminator :

#!/bin/bash vim foo

Ejecute la secuencia de comandos, carga vim, no hay mensajes de error, se comporta de la forma habitual. Sin embargo, existen docenas de variaciones entre nuestras configuraciones, por lo que no puedo aventurarme a adivinar cuál es la diferencia. Tengo curiosidad de lo que es, pero lo pusiste en funcionamiento, que es la parte importante.


Tuve el mismo problema con ''pinfo'' en un script de shell ''while'' loop. La línea se puede usar en el script, usa ''ps'' para encontrar el tty del número de proceso actual, "$$", y almacena ese tty en $ KEY_TTY:

KEY_TTY=/dev/`ps | grep $$ | tr -s ''[:blank:]'' | cut -d " " -f 3`

Más adelante en el script, solo llame al programa tty-only, con $ KEY_TTY como entrada, en mi caso fue:

pinfo -m $s $page < $KEY_TTY

Para ''vi'' sería:

vi $a < $KEY_TTY > $KEY_TTY

La ventaja es que el script en su conjunto aún puede aceptar la entrada STDIN, y ''vi'' (o lo que sea) debería funcionar bien, sin tener que recordar establecer cualquier variable ambiental antes de ejecutar el script.


Yo quería hacer algo similar. Quería un alias que encontraría el último archivo en el que estaba trabajando y abrirlo en vi (1) para editarlo. De todos modos, no pude entender cómo hacerlo como un alias legible (en tcsh), así que acabo de crear un guión de shell feo (csh porque soy viejo) en su lugar:

#!/bin/csh set DIR = "~/www/TooMuchRock/shows/" set file = $DIR`ls -t $DIR | head -1` set tty = `tty` vi $file <$tty >$tty

(1) kraftwerk: bin> que vi vi: aliased / usr / local / bin / vim -u ~ / .exrc


Establezca su terminal tty en una variable, y luego redirija el editor de E / S a través de esa variable.

En tu script:

#!/bin/sh ls | while read a; do vi $a < $MYTTY >$MYTTY; done

Y luego ejecuta el script con:

$ MYTTY=`tty` ./myscript >/tmp/log