Existe uma maneira de executar comandos de linha de comando através do Ruby? Estou tentando criar um pequeno programa Ruby que discaria e receberia / enviaria através de programas de linha de comando como 'screen', 'rcsz', etc.
Seria ótimo se eu pudesse ligar tudo isso com Ruby (back-end do MySQL, etc.)
ruby
command-line
scripting
terminal
command-prompt
geetfun
fonte
fonte
Respostas:
Sim. Existem várias maneiras:
uma. Use
%x
ou '`':Esses métodos retornarão o stdout e redirecionarão o stderr para o do programa.
b. Use
system
:Este método retorna
true
se o comando foi bem sucedido. Ele redireciona todas as saídas para o programa.c. Use
exec
:Isso substitui o processo atual pelo criado pelo comando.
d. (rubi 1.9) use
spawn
:Este método não espera a saída do processo e retorna o PID.
e. Use
IO.popen
:Este método retornará um
IO
objeto que repercute a entrada / saída dos novos processos. Também é atualmente a única maneira que conheço de fornecer informações ao programa.f. Use
Open3
(em 1.9.2 e posterior)Open3
tem várias outras funções para obter acesso explícito aos dois fluxos de saída. É semelhante ao popen, mas dá acesso ao stderr.fonte
io = IO.popen 'cat > out.log', 'r+'
; grava as saídas do comando em "out.log"FileUtils
[ ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html] ?Existem algumas maneiras de executar comandos do sistema em Ruby.
Mas se você realmente precisar executar entrada e saída com o comando stdin / stdout, provavelmente desejará examinar o
IO::popen
método, que oferece especificamente esse recurso.fonte
fonte
Sim, certamente é possível, mas o método de implementação difere dependendo se o programa de "linha de comando" em questão opera em "Tela inteira" ou no modo de linha de comando. Programas escritos para a linha de comando tendem a ler STDIN e escrever em STDOUT. Eles podem ser chamados diretamente no Ruby usando os métodos de crase padrão e / ou chamadas de sistema / exec.
Se o programa opera no modo "Full Screen", como screen ou vi, a abordagem deve ser diferente. Para programas como esse, você deve procurar uma implementação Ruby da biblioteca "esperar". Isso permitirá que você crie um script do que espera ver na tela e o que enviar quando vir essas strings específicas aparecerem na tela.
Esta provavelmente não é a melhor abordagem e você provavelmente deve olhar o que está tentando alcançar e encontrar a biblioteca / gem relevante para fazer isso, em vez de tentar automatizar um aplicativo de tela inteira existente. Como um exemplo, " Preciso de ajuda com comunicações de porta serial em Ruby " lida com comunicações de porta serial, um pré-cursor para discagem se for isso que você deseja alcançar usando os programas específicos que mencionou.
fonte
O método mais usado está usando
Open3
aqui é minha versão editada do código acima com algumas correções:fonte