Linha de Comando Ruby: Como posso enviar o comando CTRL-C através de texto na linha de comando?

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

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.

  1. O arquivo de cair é passado em uma variável; Para esse efeito:. {MY_VAR}
  2. I executar um script shell no shell /usr/bin/ruby da seguinte forma system("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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top