2012-03-01 14 views
11

sto avendo le citazioni di difficoltà nidificato all'interno di uno script bashcitazioni Bash nidificati e eval

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

È possibile che questo mi ha fatto

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

risposta

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

Non sono sicuro che il collegamento fornito discuta l'uso suggerito di bash array. –

+0

@TomHale: la mia risposta ha avuto un errore di sintassi. –

9

Questo perché \' doesn' t avere un significato speciale all'interno di una stringa con quotatura singola; significa semplicemente "backslash, seguito da end-of-string".

Un'opzione è utilizzare $'...' anziché '... '; che ti consentirà di usare le escape-backslash. Sarebbe simile a questa:

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

Il rovescio della medaglia è che se c'è qualche possibilità che $RVM_PATH, $config_rvm, o una qualsiasi delle altre variabili potrebbero includere un backslash, allora troppo potrebbe essere interpretato come l'introduzione di un backslash-fuga.