Ligne de commande Ruby: Comment puis-je envoyer la commande CTRL-C via du texte dans la ligne de commande?

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

Question

J'essaie de créer un simple droplet Automator qui récupère le fichier style.less et exécute la commande LESS suivante:

$ LESSC {DROPPED_FILE} --watch

qui surveillera les modifications apportées au fichier que j'ai déposé et mettra alors automatiquement à jour le style.css

affiché.

FYI: J'utilise MOINS pour avoir des fichiers CSS écrits dynamiquement. cliquez ici .

La gouttelette de base fonctionne très bien.

  1. Le fichier déposé est passé dans une variable. Pour cela: {MY_VAR} .
  2. J'exécute un script shell dans le shell / usr / bin / ruby ?? comme suit system (" lessc {MY_VAR} --watch & amp; ")

Cela fonctionne très bien, mais je souhaite que le --watch soit arrêté lors de la fermeture de l'application Automator.

La documentation LESS indique que vous devez appuyer sur le raccourci CTRL-C dans le shell de ligne de commande pour abandonner le script.

Mais puisque je ne suis pas dans la fenêtre du terminal (la commande est passée en arrière-plan), je ne sais pas comment abandonner le script.

Même après la fermeture du fichier automator.app, le fichier style.less reste sous surveillance et les modifications apportées et le style.css généré en conséquence sont toujours en cours de réécriture.

Donc, en gros, je dois passer la commande d'abandon à la sortie du .app.

J'ai généré une simple fenêtre contextuelle qui fermera l'application après un clic après l'envoi d'une autre commande au terminal shell.

C’est la partie où tous mes essais ont échoué pour arrêter le script.

Existe-t-il une fonction de ligne de commande ayant le même effet que d'appuyer sur la commande CTRL-C? Comment pourrais-je passer le meilleur à la coquille?

Était-ce utile?

La solution

Si vous appuyez sur CTRL-C dans votre console, cela n’est pas envoyé via STDIN à votre programme. Bash (ou ce que vous utilisez) traite CTRL-C spécial. La bash envoie un signal au processus. Dans le cas de CTRL-C, il s'agit de SIGINT. Pour envoyer un signal à un programme, vous devez non, c'est pid. Ensuite, vous pouvez envoyer le signal au pid. Pour pouvoir obtenir le pid, vous pouvez commencer le processus avec ruby.

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

En ruby, il existe au moins 3 façons différentes d'exécuter quelque chose.

`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

Vous avez utilisé system (& less; lessc # {file} --watch & amp; ") qui renvoie également imidietly mais renvoie toujours 0.

Autres conseils

Conseil: que fait ^ C Control-C dans un shell?

(Il n'envoie pas de caractère).

Clarification sur l'indice: Cette PDF parle de signaux . Notez où il est également question de ^ C. Vous pouvez manuellement envoyer un signal si nécessaire.

Lorsque vous appuyez sur ^ C dans un terminal, il envoie normalement le signal SIGINT au programme en cours d'exécution. Vous pouvez également envoyer ces signaux en Ruby. Plus d'informations sur l'utilisation de processus (et l'envoi de signaux) en Ruby: http://whynotwiki.com/Ruby_/_Process_management .

Joyeux codage.

less se termine également à la réception du & q; q " personnage, je pense.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top