Línea de comando Ruby: ¿Cómo puedo enviar el comando CTRL-C a través del texto en la línea de comando?

StackOverflow https://stackoverflow.com/questions/1616982

Pregunta

Estoy intentando crear un droplet de Automator simple que tomará el archivo style.less y ejecute el siguiente comando LESS:

$ LESSC {DROPPED_FILE} --watch

que monitoreará el archivo que he introducido para cualquier cambio y luego actualizará automáticamente el style.css

FYI: Estoy usando LESS para tener archivos CSS escritos dinámicamente. Más información es aquí .

La gota básica funciona muy bien.

  1. El archivo soltado se pasa a una variable; Para este propósito: {MY_VAR} .
  2. Ejecuto un script de shell en el shell / usr / bin / ruby ?? del siguiente modo (" lessc {MY_VAR} --watch & amp; ")

esto funciona muy bien, sin embargo quiero que se detenga --watch al salir de la aplicación automator.

La documentación de LESS dice que debes presionar el acceso directo CTRL-C mientras estás en el shell de la línea de comandos para abortar el script.

Pero como no estoy dentro de la ventana del terminal (el comando se está pasando en segundo plano) no sé cómo abortar el script.

Incluso después de que el automator.app se haya cerrado, el archivo style.less todavía se está vigilando en busca de cambios y el style.css generado de manera correspondiente aún se está reescribiendo. / p>

Básicamente, necesito pasar el comando abortar al salir de la aplicación.

He generado una ventana emergente simple que al hacer clic cerrará la aplicación después de pasar otro comando al terminal shell.

Esta es la parte en la que todos mis intentos han sido infructuosos para detener el script.

¿Existe una función de línea de comandos que actúe de la misma manera que presionar el comando CTRL-C? ¿Cómo pasaría esto lo mejor al shell?

¿Fue útil?

Solución

Si presiona CTRL-C en su consola, esto no se envía a través de STDIN a su programa. Bash (o lo que sea que uses) trata a CTRL-C especial. El bash envía una señal al proceso. En el caso de CTRL-C esto es SIGINT. Para enviar una señal a un programa no necesita pedirlo. Entonces puedes enviar la señal al pid. Para poder obtener el pid puede iniciar el proceso con ruby.

p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)

En ruby ??hay al menos 3 formas diferentes de ejecutar algo.

`lessc #{file} --watch` # returns stdout after exit
system("lessc #{file} --watch") # returns the integer return value after exit
Io.popen("lessc #{file} --watch") # returns imidietly an io object, where STDIN and STDOUT can be written and read

Usaste el sistema (" lessc # {file} --watch & amp; ") que también devuelve de manera inmediata pero siempre devuelve 0.

Otros consejos

Sugerencia: ¿Qué hace ^ C Control-C realmente en una shell?

(No envía un carácter).

Aclaración sobre la pista: Este PDF habla sobre señales . Nótese donde también se habla de ^ C. Puede enviar manualmente una señal según sea necesario.

Cuando presiona ^ C en un terminal, normalmente envía la señal SIGINT al programa que se está ejecutando. También puedes enviar estas señales en Ruby. Más información sobre cómo trabajar con procesos (y enviar señales) en Ruby: http://whynotwiki.com/Ruby_/_Process_management .

Codificación feliz.

menos también termina cuando recibe el " q " personaje, creo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top