Да. Потому что eval требует дополнительных кавычек, а значит, дополнительный уровень экранирования.
К примеру, вам нужно выполнить команду echo '\"'
чтобы вывести слэш и кавычку.
Если вы пишете: eval "echo '\"'"
то при раскрытии внешних кавычек слэш обработается и исчезнет, и eval выполнит следующую команду: echo '"'
выведя только кавычку.
Чтобы получить правильный результат, потребуется 3 слэша: eval "echo '\\\"'"
первый и второй превратятся в один, а третий нужен, чтобы средняя кавычка не рассматривалась как закрывающая.
Аналогично у вас. Я не знаю, какой вариант вы написали, но правильным будет следующий: eval "sed -i -e 's/\"db1\"/& \\&\\& \$name ne \"nss_test1\"/' script.pl"
Но лучше обойтись без eval.
Спасибо. Эх, а я надеялся, что есть способ в скрипте принять от пользователя и выполнить команду точно в таком виде, как если бы он ее вводил в bash. Ну что ж, обойдемся без eval.
Спасибо. Эх, а я надеялся, что есть способ в скрипте принять от пользователя и выполнить команду точно в таком виде, как если бы он ее вводил в bash.
Принять от пользователя? Конечно, есть.
Shell
read -r foo
eval "$foo"
Всё это экранирование нужно не для команды eval, а для вписывания спецсимволов без их досрочной интерпретации. Если вы ничего не вписываете, только передаёте переменную, то и экранировать ничего не надо.
Всё это экранирование нужно не для команды eval, а для вписывания спецсимволов без их досрочной интерпретации. Если вы ничего не вписываете, только передаёте переменную, то и экранировать ничего не надо.
Елки, про флаг -r я не знал. Спасибо еще раз. Правда с этим флагом нельзя делать перенос строк с помощью "\", но это ерунда.