2012-04-03 15 views
8

En Ruby, sé que puedo ejecutar un comando shell con acentos abiertos de este modo:Ruby Backticks: ¿rompe el comando en varias líneas?

`ls -l | grep drw-` 

Sin embargo, estoy trabajando en un guión que exige unos pocos comandos bastante largos de concha, y por amor de lectura I' Me gusta poder dividirlo en varias líneas. Supongo que no puedo simplemente arrojar un signo más como con Strings, pero tengo curiosidad de saber si existe alguna técnica de concatenación de comandos de alguna otra manera para dividir limpiamente una cadena larga de comandos en varias líneas de código fuente.

+1

Personalmente, si tengo que llamar a algunos comandos shell largas, me los puse en un script de shell, y luego llamar eso y captura su salida. Prefiero mantener las secuencias de comandos de shell por separado de mi código de Ruby. –

Respuesta

10

Puede utilizar la interpolación:

`#{"ls -l" + 
    "| grep drw-"}` 

o poner el comando en una variable e interpolar la variable:

cmd = "ls -l" + 
     "| grep drw-" 
`#{cmd}` 

Dependiendo de sus necesidades, también puede ser capaz de utilizar un different method of running the shell command, como system, pero tenga en cuenta que su comportamiento no es exactamente el mismo que el de los backticks.

+0

Gracias, pensé que sería algo simple pero tuve problemas para formar mi consulta de Google para recuperar algo significativo. – asfallows

33

Puede escapar retornos de carro con un \:

`ls -l \ 
| grep drw-` 
+5

¡Funciona! Esta es la respuesta más correcta. – FloatingRock

+1

Eso es lo que estoy buscando. –

1

También puede hacer esto con explícita \n:

cmd_str = "ls -l\n" + 
      "| grep drw-" 

... y luego poner la cadena combinada dentro de acentos abiertos.

`#{cmd_str}` 
7

Uso %x:

%x(ls -l | 
    grep drw-) 

Otra:

%x(
    echo a 
    echo b 
    echo c 
) 
# => "a\nb\nc\n" 
+1

Tenga en cuenta que es crucial tener tuberías ('|') al final de la primera línea, no al comienzo de la segunda. – codener

Cuestiones relacionadas