Linha de Comando Ruby: Como posso enviar o comando CTRL-C através de texto na linha de comando?
-
06-07-2019 - |
Pergunta
Eu estou tentando criar um simples Automator gota que terá o arquivo style.less
caiu para ele e execute o seguinte comando MENOS nele:
$ LESSC {DROPPED_FILE} --watch
que irá monitorar o arquivo já caiu para quaisquer alterações e, em seguida, atualizar automaticamente o outputted style.css
FYI: Eu estou usando menos ter arquivos CSS escritos de forma dinâmica. Mais informações é aqui .
A gota básica funciona muito bem.
- O arquivo de cair é passado em uma variável; Para esse efeito:.
{MY_VAR}
- I executar um script shell no shell
/usr/bin/ruby
da seguinte formasystem("lessc {MY_VAR} --watch &")
isso funciona muito bem no entanto eu quero o --watch para ser parado em cima de sair do aplicativo Automator.
A documentação MENOS diz para pressionar o atalho CTRL-C, enquanto no shell de linha de comando para abortar o script.
Mas desde que eu não estou dentro da janela de terminal (comando está sendo passado no fundo) Eu não sei como abortar o script.
Mesmo após a automator.app foi fechado o arquivo style.less
ainda está sendo vigiado por mudanças eo style.css
correspondentemente gerado ainda está sendo reescrito.
Então, basicamente, eu preciso passar o comando abortar na saída do .app.
Eu tenho gerado um simples pop-up que no clique irá fechar o aplicativo depois passando outro comando para o shell terminal.
Esta é a parte onde todas as minhas tentativas foram infrutíferas para parar o script.
Existe uma função de linha de comando que age o mesmo que pressionar o comando CTRL-C? Como eu iria passar este o melhor para o shell?
Solução
Se você pressionar CTRL-C no seu console, isso não é enviar via STDIN para o seu Programa. Bash (ou o que você usa) trata CTRL-C especial. A festa envia um sinal para o processo. Em caso de CTRL-C este é SIGINT. Para enviar um sinal a um programa que você precisa não, de pid. Então você pode enviar o sinal para o pid. Para ser capaz de obter o pid você pode começar o processo com rubi.
p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)
Em Ruby, há pelo menos 3 maneiras diferentes, de executar alguma coisa.
`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
Você usou system("lessc #{file} --watch&")
que também retorna imidietly mas sempre retorna 0.
Outras dicas
Dica:? O que faz ^ C Control-C realmente fazer em uma shell
(Não enviar um personagem).
Esclarecimento sobre dica: Este fala PDF sobre sinais . Nota onde ele também fala sobre ^ C. Sua pode enviar manualmente um sinal, conforme necessário.
Quando você pressiona ^ C em um terminal que normalmente envia o sinal SIGINT para o programa que está sendo executado. Você pode enviar esses sinais em Ruby também. Mais informações sobre como trabalhar com os processos (e envio de sinais) em Ruby: http://whynotwiki.com/Ruby_/_Process_management .
Happy codificação.
menos também termina quando recebe o caráter "q", eu acho.