Bash вложенные кавычки и eval

У меня возникают трудности с вложенными кавычками в bash script

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

Выше получилось

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

Ответ 1

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

Ответ 2

Это потому, что \' не имеет особого значения в одной кавычки; это означает просто "обратную косую черту, за которой следует конец строки".

Один вариант - использовать $'...' вместо '... '; это позволит вам использовать обратную косую черту. Это будет выглядеть так:

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

Недостатком является то, что если есть вероятность, что $RVM_PATH, $config_rvm или любая из других переменных может включать обратную косую черту, то это также можно интерпретировать как введение обратного слэша-escape.