Riga di comando Ruby: come posso inviare il comando CTRL-C via testo nella riga di comando?
-
06-07-2019 - |
Domanda
Sto cercando di creare un semplice drop di Automator che prenderà il file style.less
inserito in esso ed eseguirà il seguente comando LESS su di esso:
$ LESSC {DROPPED_FILE} --watch
che monitorerà il file che ho inserito per eventuali modifiche e aggiornerà automaticamente il style.css
in uscita
Cordiali saluti: sto usando MENO per avere file CSS scritti dinamicamente. Ulteriori informazioni sono qui .
La gocciolina di base funziona alla grande.
- Il file rilasciato viene passato in una variabile; A tal fine:
{MY_VAR}
. - Eseguo uno script di shell nella shell
/ usr / bin / ruby ??
come seguesistema (" lessc {MY_VAR} --watch & amp; ")
funziona alla grande ma voglio che --watch venga arrestato quando si esce dall'app di automazione.
La documentazione LESS dice di premere il collegamento CTRL-C mentre si è nella shell della riga di comando per interrompere lo script.
Ma dal momento che non sono all'interno della finestra del terminale (il comando viene passato in background) non so come interrompere lo script.
Anche dopo la chiusura di automator.app, il file style.less
viene ancora monitorato per le modifiche e il style.css
generato di conseguenza viene ancora riscritto.
Quindi in pratica devo passare il comando abort all'uscita di .app.
Ho generato un semplice pop-up che al clic chiuderà l'app dopo passando un altro comando alla shell del terminale.
Questa è la parte in cui tutti i miei tentativi non sono riusciti a fermare la sceneggiatura.
Esiste una funzione della riga di comando che agisce come se si premesse il comando CTRL-C? Come potrei passare il meglio alla shell?
Soluzione
Se si preme CTRL-C nella console, questo non viene inviato tramite STDIN al programma. Bash (o qualunque cosa tu usi) tratta lo speciale CTRL-C. Il bash invia un segnale al processo. Nel caso di CTRL-C questo è SIGINT. Per inviare un segnale a un programma non è necessario che sia pid. Quindi è possibile inviare il segnale al pid. Per essere in grado di ottenere il pid puoi iniziare il processo con ruby.
p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)
In ruby ??ci sono almeno 3 modi diversi di eseguire qualcosa.
`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
Hai utilizzato il sistema (" lessc # {file} --watch & amp; ")
che restituisce anche in modo imidioso ma restituisce sempre 0.
Altri suggerimenti
Suggerimento: cosa fa ^ C Control-C veramente in una shell?
(Non invia un personaggio).
Chiarimento su suggerimento: Questo PDF parla di segnali . Nota dove parla anche di ^ C. Puoi inviare manualmente un segnale come richiesto.
Quando si preme ^ C in un terminale normalmente invia il segnale SIGINT al programma in esecuzione. Puoi inviare questi segnali anche in Ruby. Ulteriori informazioni su come lavorare con i processi (e inviare segnali) in Ruby: http://whynotwiki.com/Ruby_/_Process_management .
Buona codifica.
less termina anche quando riceve il simbolo "q" personaggio, credo.