eval не правильно интерпретирует sed?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

eval не правильно интерпретирует sed?

Сообщение Brainsburn »

Есть файл, содержащий такую строку:

Код: Выделить всё

if ($name ne "nss_ldap" && $name ne "db1"

Ее надо заменить на

Код: Выделить всё

if ($name ne "nss_ldap" && $name ne "db1" && $name ne "nss_test1"

Делается это sed-ом:

Код: Выделить всё

sed -i -e 's/"db1"/& \&\& $name ne "nss_test1"/' script.pl

Когда выполняю это в bash-е, то все идет как надо. Но если эту команду выполнить из баш-скрипта через eval, то измененная строка получается такой:

Код: Выделить всё

if ($name ne "nss_ldap" && $name ne "db1" "db1""db1" $name ne "nss_test1"

Т.е. получается, что удаляются два обратных слеша и выполняется следующее:

Код: Выделить всё

sed -i -e 's/"db1"/& && $name ne "nss_test1"/' script.pl

Кто-нибудь знает, почему так происходит?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5457
ОС: Gentoo

Re: eval не правильно интерпретирует sed?

Сообщение /dev/random »

Да. Потому что eval требует дополнительных кавычек, а значит, дополнительный уровень экранирования.
К примеру, вам нужно выполнить команду
echo '\"'
чтобы вывести слэш и кавычку.
Если вы пишете:
eval "echo '\"'"
то при раскрытии внешних кавычек слэш обработается и исчезнет, и eval выполнит следующую команду:
echo '"'
выведя только кавычку.
Чтобы получить правильный результат, потребуется 3 слэша:
eval "echo '\\\"'"
первый и второй превратятся в один, а третий нужен, чтобы средняя кавычка не рассматривалась как закрывающая.

Аналогично у вас. Я не знаю, какой вариант вы написали, но правильным будет следующий:
eval "sed -i -e 's/\"db1\"/& \\&\\& \$name ne \"nss_test1\"/' script.pl"
Но лучше обойтись без eval.
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: eval не правильно интерпретирует sed?

Сообщение Brainsburn »

Спасибо. Эх, а я надеялся, что есть способ в скрипте принять от пользователя и выполнить команду точно в таком виде, как если бы он ее вводил в bash. Ну что ж, обойдемся без eval.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5457
ОС: Gentoo

Re: eval не правильно интерпретирует sed?

Сообщение /dev/random »

Brainsburn писал(а):
02.03.2011 03:52
Спасибо. Эх, а я надеялся, что есть способ в скрипте принять от пользователя и выполнить команду точно в таком виде, как если бы он ее вводил в bash.

Принять от пользователя? Конечно, есть.

Shell

read -r foo eval "$foo"


Всё это экранирование нужно не для команды eval, а для вписывания спецсимволов без их досрочной интерпретации. Если вы ничего не вписываете, только передаёте переменную, то и экранировать ничего не надо.
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: eval не правильно интерпретирует sed?

Сообщение Brainsburn »

/dev/random писал(а):
02.03.2011 04:03
Принять от пользователя? Конечно, есть.

Shell

read -r foo eval "$foo"


Всё это экранирование нужно не для команды eval, а для вписывания спецсимволов без их досрочной интерпретации. Если вы ничего не вписываете, только передаёте переменную, то и экранировать ничего не надо.

Елки, про флаг -r я не знал. Спасибо еще раз. Правда с этим флагом нельзя делать перенос строк с помощью "\", но это ерунда.
Спасибо сказали: