2009-10-24 4 views
3

Je suis en train de créer un simple goutte Automator qui prendra le fichier style.less est tombé dans et exécutez la commande suivante MOINS dessus:Ruby Command Line: Comment envoyer la commande CTRL-C via du texte dans la ligne de commande?

$ LESSC {DROPPED_FILE} --watch

qui surveillera le fichier que je suis tombé dans tout changement et mettra automatiquement à jour la sortie style.css

FYI: J'utilise LESS pour avoir des fichiers CSS écrits dynamiquement. Plus d'infos est here.

La gouttelette de base fonctionne très bien.

  1. Le fichier déposé est transmis dans une variable; Pour ce faire: {MY_VAR}.
  2. Je lance un script shell dans le shell /usr/bin/ruby comme suit system("lessc {MY_VAR} --watch &")

cela fonctionne très bien mais je veux que le --watch soit arrêté au moment de quitter l'application Automator.

La documentation de LESS indique d'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 annuler le script.

Même après la fermeture du fichier automator.app, le fichier style.less est toujours en cours de vérification des modifications et le fichier style.css correspondant est toujours en cours de réécriture.

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

J'ai généré un simple pop-up qui, au clic, fermera l'application après en passant une autre commande à l'interpréteur de commandes du terminal.

C'est la partie où toutes mes tentatives n'ont pas réussi à arrêter le script.

Y a-t-il une fonction de ligne de commande qui agit comme si vous appuyiez sur la commande CTRL-C? Comment pourrais-je passer le meilleur à la coquille?

Répondre

6

Si vous appuyez sur CTRL-C dans votre console, ce n'est pas envoyé via STDIN à votre programme. Bash (ou tout ce que vous utilisez) traite CTRL-C spécial. Le bash envoie un signal au processus. Dans le cas de CTRL-C c'est SIGINT. Pour envoyer un signal à un programme dont vous avez besoin, non c'est pid. Ensuite, vous pouvez envoyer le signal au pid. Pour être en mesure d'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 y a 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("lessC#{file} --watch&") qui retourne aussi imidietly mais retourne toujours 0.

+0

Merci d'avoir pris le temps de le faire. Une question rapide cependant, je suis en effet très nouveau à la ligne de commande Ruby, et jusqu'à présent, j'ai seulement été copier coller et suivre les instructions que je peux trouver en ligne, dans ce cas: Je ne sais pas vraiment comment exécuter la commande m'a donné .. comment puis-je entrer dans mon instance terminal en mode «ruby»? Aussi: Chaque ligne est-elle une commande séparée (comme dans I la première ligne et appuyez sur 'return' puis la 2ème ligne et ainsi de suite? – Jannis

+0

Quand j'ai vu l'étiquette de rubis, j'ai supposé que vous vouliez écrire un script ruby. – johannes

0

moins se termine également quand il reçoit le caractère "q", je pense.

+0

hmm .. Je 'ai essayé de faire lessc $ q' et il ne fonctionne malheureusement pas. Merci pour l'idée, très appréciée. – Jannis

1

Conseil: Qu'est-ce^C Control-Cvraiment faire dans une coquille?

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

Clarification sur l'indice: Ce PDF talks about signals. Notez où il parle aussi de^C. Vous pouvez envoyer un signal manuellement 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 dans Ruby. Plus d'informations sur l'utilisation des processus (et l'envoi de signaux) dans Ruby: http://whynotwiki.com/Ruby_/_Process_management.

Bonne codification.

+0

Est-ce que cela signifie qu'il n'y a aucun moyen d'arrêter le script sans utiliser le terminal et en appuyant sur le combo de touches CTRL-C? – Jannis

+0

Pas du tout. Un terminal interactif vient intercepter^C et lui fait faire quelque chose de spécial. La même chose que généralement vrai^D et^Z, par exemple. Vous pouvez faire ce que le terminal fait directement. –

+0

J'ai lu le PDF mais c'est assez difficile à comprendre car je suis loin d'être un programmeur. Je voulais juste créer cette petite goutte pour rendre mon flux de travail rapide à long terme. Il semble que ce n'est pas une option pour moi. Merci pour votre indice, peut-être que si j'avais plus de connaissances dans ce domaine, je l'aurais mieux compris. – Jannis

Questions connexes