2012-04-03 17 views
8

In Ruby, so di poter eseguire un comando shell con apici inversi in questo modo:Ruby Backticks - interrompe il comando su più righe?

`ls -l | grep drw-` 

Tuttavia, sto lavorando su uno script che richiede alcuni comandi piuttosto lunghi di shell, e per amor di leggibilità I' Mi piacerebbe essere in grado di romperlo su più linee. Suppongo che non possa semplicemente inserire un segno più come con le stringhe, ma sono curioso di sapere se esiste una tecnica di concatenazione dei comandi di un altro modo per rompere in modo pulito una lunga stringa di comando in più righe di codice sorgente.

+1

Personalmente, se ho bisogno di chiamare alcuni comandi di shell lunghe, mi piacerebbe metterli in uno script di shell, e quindi chiamare quello e catturare la sua uscita. Preferirei mantenere gli script di shell separatamente dal mio codice Ruby. –

risposta

10

È possibile utilizzare l'interpolazione:

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

o mettere il comando in una variabile e interpolare la variabile:

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

A seconda delle esigenze, si può anche essere in grado di utilizzare un different method of running the shell command, come system, ma nota che il suo comportamento non è esattamente lo stesso dei backtick.

+0

Grazie, ho pensato che sarebbe stato qualcosa di semplice ma ho avuto problemi a formare la mia query su Google per ottenere qualcosa di significativo. – asfallows

33

Si può sfuggire ritorni a capo con un \:

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

Funziona! Questa è la risposta più corretta. – FloatingRock

+1

Questo è quello che sto cercando. –

1

Si può anche fare questo con esplicito \n:

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

... e poi mettere la stringa combinato all'interno backticks.

`#{cmd_str}` 
7

Uso %x:

%x(ls -l | 
    grep drw-) 

altro:

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

Nota che è fondamentale avere pipe ('|') alla fine della prima riga, non all'inizio del secondo. – codener