LINUX.ORG.RU

Экранирование в шелле


0

0

Нужно загнать определение такой ф-ции:
 
test_proc_failed()
{
    if grep '^(return status = 1000)$' $1; then
        return 1
    fi
    return 0
}

в переменную окружения VAR, так чтобы если пишешь
$VAR
объявлялась эта функция. (Это нужно потому что экспортировать переменные можно, а функции нет..) 

И я не могу экранировать: Пишу:
$ VAR='test_proc_failed() { if grep \'^(return status = 1000)\$\' $1; then return 1; fi; return 0; }'
syntax error: `\$\'' unexpected 

★★★★★

VAR="test_proc_failed() { if grep \'^(return status = 1000)\$\' $1; then return 1; fi; return 0; }"

Не будет ругаться. Только все равно не поможет...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

ну это неправильно. Во первых потому что почему \'? Во вторых потому что $1 внутри обычных кавычек раскроется на этапе присвоения.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

> Все равно не поможет ;-)

ну, у меня нет слов.. $SOME_COMMAND писать можно а $DEFINE_FUNC нет. А как это обойти? Только точку с временными файлами использовать?

dilmah ★★★★★
() автор топика

Кстати,


> Это нужно потому что экспортировать переменные можно, а функции нет..

Функции МОЖНО экспортировать:

$ tst() { echo QUQU; }
$ export -f tst
$ bash
$ tst
QUQU
$exit

Die-Hard ★★★★★
()
Ответ на: комментарий от dilmah

1. Попробуй так:

read VAR <<EOF
...
EOF

Только для read'а нужно будет еще переводы строк экранировать.

2. $'' тоже специфика баша?

3. Почему бы не записать определения функций в отдельный файл, а там где они понадобятся сделать source?

amm ★★
()

$ VAR="test_proc_failed() { if grep '^(return status = 1000)$' \$1; then return 1; fi; return 0; }"

ivo@IVO ~
$ eval $VAR

$ test_proc_failed xxx
(return status = 1000)

$ $VAR
bash: test_proc_failed(): command not found

io ★★
()
Ответ на: комментарий от amm

> 1. Попробуй так: 
> read VAR <<EOF 
> ... 
> EOF 
> Только для read'а нужно будет еще переводы строк экранировать.

ну там внутри ... сто пудов некоторый препроцессинг идет -- $VAR например раскрывается также как и в двойных кавычках.

> 2. $'' тоже специфика баша?

нет:)  на самом деле на стандартном шелле можно вполне нормально
писать.  То что функции не экспортируются это правильное решение,
потому что свойства процесса это переменные окружения а не какие-то ф-ции.  Тот же баш экспортирует функции все равно через переменные.

> 3. Почему бы не записать определения функций в отдельный файл, а
> там где они понадобятся сделать source?

я так и сделал, сейчас на эвал меняю

dilmah ★★★★★
() автор топика
Ответ на: комментарий от amm

> 2. $'' тоже специфика баша?

а что ты имел в виду под $''?

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> ну там внутри ... сто пудов некоторый препроцессинг идет -- $VAR
 например раскрывается также как и в двойных кавычках.

Согласен, этот вариант слишком мудреный получается. Хотя в баше можно 
запретить интерполяцию, написав <<'EOF'.

>> 3. Почему бы не записать определения функций в отдельный файл, а
>> там где они понадобятся сделать source?

> я так и сделал, сейчас на эвал меняю

Если не секрет, зачем понадобилось менять?


> а что ты имел в виду под $''?

Возможность экранирования одинарных кавычек внутри:

VAR=$'test_proc_failed() { if grep \'^(return status = 1000)$\' $1; then return 1; fi; return 0; }'

amm ★★
()
Ответ на: комментарий от amm

> Если не секрет, зачем понадобилось менять?

чем меньше временных файлов, тем лучше..

> $''

да, это тоже специфика баша.

dilmah ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.