2012-03-01 22 views
11

YukarıdaBash iç içe tırnak ve eval

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

bir bash komut dosyası içinde zorluk iç içe tırnak yaşıyorum

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

cevap

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

Sağladığınız bağlantıyı, bash dizilerinin önerilen kullanımınızı ele aldığından emin değilim. –

+0

@TomHale: Cevabım bir sözdizimi hatasıydı. –

9

bana var çünkü \' doesn' Tek tırnaklı bir dizgede herhangi bir özel anlama sahip olmak; basitçe "ters eğik çizgi, ardından dizgenin sonu" anlamına gelir.

Bir seçenek '... 'yerine $'...''; bu, ters eğik çıkışlar kullanmanıza izin verecektir. Bu şuna benzer:

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

olumsuz $RVM_PATH, $config_rvm veya diğer değişkenlerin herhangi bir ters eğik çizgi dahil olma ihtimali varsa, o zaman çok bir ters eğik çizgi-kaçış tanıtan olarak yorumlanabilir olmasıdır.