2011-11-16 8 views
7

Necesito ejecutar un comando Bash en un script de Ruby. Hay aproximadamente 6 formas de hacer esto de acuerdo con "6 Ways to Run Shell Commands in Ruby" by Nate Murray y algunas otras fuentes en Google.ruby ​​execute comando bash con variables

print "enter myid: " 
myID = gets 
myID = myID.downcase 
myID = myID.chomp 
print "enter host: " 
host = gets 
host = host.downcase 
host = host.chomp 
print "winexe to host: ",host,"\n" 
command = "winexe -U domain\\\\",ID," //",host," \"cmd\"" 
exec command 
+0

¿Qué clase espera que sea 'command'? –

Respuesta

4

Por lo que vale en realidad se puede encadenar esos métodos, y puts imprimirá una nueva línea para usted, por lo que este podría ser sólo:

print "enter myid: " 
myID = STDIN.gets.downcase.chomp 

print "enter host: " 
host = STDIN.gets.downcase.chomp 

puts "winexe to host: #{host}" 
command = "winexe -U dmn1\\\\#{myID} //#{host} \"cmd\"" 
exec command 
+0

perfecto gracias. Fue mi primer guión de rubí, así que gracias también por la nota sobre cómo encadenar esos métodos, creo que su mal uso es mucho. – toosweetnitemare

+0

También puede usar el operador de concatenación de cadenas (+) si no desea interpolar las variables dentro de una cadena entrecomillada: 'command =" winexe -U dmn1 \\\\ "+ myId +" // "+ host + '"cmd"' ', o use la sintaxis similar a printf de Ruby:' command = 'winexe -U dmn1 \\\\% s //% s "cmd"'% [myId, host] ' –

+0

gracias glenn, eso es información muy útil – toosweetnitemare

5

Parece que puede haber problemas con la forma en que estaba poniendo su cadena de comandos juntos.
Además, tuve que referirme directamente a STDIN.

# Minimal changes to get it working: 
print "enter myid: " 

myID = STDIN.gets 
myID = myID.downcase 
myID = myID.chomp 

print "enter host: " 
host = STDIN.gets 
host = host.downcase 
host = host.chomp 

print "winexe to host: ",host,"\n" 
command = "echo winexe -U dmn1\\\\#{myID} //#{host} \"cmd\"" 
exec command 



versión compacta:

print "enter myid: " 
myID = STDIN.gets.downcase.chomp 

print "enter host: " 
host = STDIN.gets.downcase.chomp 

puts "winexe to host: #{host}" 
exec "echo winexe -U dmn1\\\\#{myID} //#{host} \"cmd\"" 

Últimos dos líneas con estilo printf:

puts "winexe to host: %s" % host 
exec "echo winexe -U dmn1\\\\%s //%s \"cmd\"" % [myID, host] 

Últimos dos líneas con más concatenación de cadenas:

puts "winexe to host: " + host 
exec "echo winexe -U dmn1\\\\" + myID + " //" + host + " \"cmd\"" 

últimas dos líneas con C append estilo ++:

puts "winexe to host: " << host 
exec "echo winexe -U dmn1\\\\" << myID << " //" << host << " \"cmd\"" 
+0

esto también funciona, gracias. pero voy a usar el método encadenado que Matt me mostró arriba. – toosweetnitemare

+0

@toosweetnitemare: Por alguna razón, tuve la idea de que debería cambiar tu código lo menos posible, pero ahora parece una mala idea: P –

+0

lol. Me acabo de enseñar Ruby ayer por la tarde antes de publicar mi pregunta, así que definitivamente demostró mi falta de comprensión de la sintaxis en el idioma. Gracias por tomarse el tiempo para desglosar su ejemplo en tantas opciones diferentes. Eso será muy valioso para otros usuarios que ven este hilo más tarde. Si pudiera dar crédito por dos respuestas, también se las daría. ¡Gracias por su aporte! – toosweetnitemare

Cuestiones relacionadas