Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Особенности exec

0 views
Skip to first unread message

Maxim Tyurin

unread,
Sep 18, 2007, 8:10:52 PM9/18/07
to
Hi!
Что-то я не могу понять особенностей работы с exec :(
Точнее как выполняется команда.
Вот пример:
set IP /sbin/ip
set r "via 192.168.0.1 dev eth0"
exec $IP route del default $r

на это мне выдается
Error: either "to" is duplicate, or "via 192.168.0.1 dev eth0" is a garbage.

И никак я не могу запустить эту команду.

Пока выкрутился так:
set command "$IP route del default $r"
exec sh -c $command

Hо хотелось бы без костылей.

Где внятно расписано как работает exec и почему он у меня не работает?
--

With Best Regards, Maxim Tyurin
JID: MrK...@jabber.pibhe.com

Artem Chuprina

unread,
Sep 19, 2007, 3:29:58 AM9/19/07
to
Maxim Tyurin @ Wed, 19 Sep 2007 00:10:52 +0000 (UTC):

MT> Hi!
MT> Что-то я не могу понять особенностей работы с exec :(
MT> Точнее как выполняется команда.
MT> Вот пример:
MT> set IP /sbin/ip
MT> set r "via 192.168.0.1 dev eth0"
MT> exec $IP route del default $r

MT> на это мне выдается
MT> Error: either "to" is duplicate, or "via 192.168.0.1 dev eth0" is a garbage.

MT> И никак я не могу запустить эту команду.

MT> Пока выкрутился так:
MT> set command "$IP route del default $r"
MT> exec sh -c $command

MT> Hо хотелось бы без костылей.

MT> Где внятно расписано как работает exec и почему он у меня не работает?

У тебя не работает потому, что exec не разбирает $r на отдельные
параметры (и правильно, не его это дело), а ip хочет, чтобы via,
192.168.0.1, dev и eth0 были отдельными параметрами.

Когда ты выкручиваешься, ты поручаешь разбор строки на отдельные
параметры шеллу. Можно сделать это самостоятельно - eval exec $IP route
del default $r. Тогда ты поручишь разбор строки на отдельные параметры
интерпретатору Tcl (eval рекурсивно зовет интерпретатор). Если бы у
тебя при этом имя файла в $IP содержало пробелы (для команды это редко
бывает надо, но бывает, а для прочих параметров регулярно),
потребовалось бы сказать eval exec [list $IP] ... Hо в твоем случае
слова пробелов не содержат, и можно без этого обойтись.

--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: r...@jabber.ran.pp.ru

Рюкзак не пересобирают, рюкзак укладывают! (c)Руна

Maxim Tyurin

unread,
Sep 19, 2007, 5:02:16 AM9/19/07
to
Artem Chuprina writes:

> Maxim Tyurin @ Wed, 19 Sep 2007 00:10:52 +0000 (UTC):
>
> MT> Hi!
> MT> Что-то я не могу понять особенностей работы с exec :(
> MT> Точнее как выполняется команда.
> MT> Вот пример:
> MT> set IP /sbin/ip
> MT> set r "via 192.168.0.1 dev eth0"
> MT> exec $IP route del default $r
>
> MT> на это мне выдается
> MT> Error: either "to" is duplicate, or "via 192.168.0.1 dev eth0" is a garbage.
>
> MT> И никак я не могу запустить эту команду.
>
> MT> Пока выкрутился так:
> MT> set command "$IP route del default $r"
> MT> exec sh -c $command
>
> MT> Hо хотелось бы без костылей.
>
> MT> Где внятно расписано как работает exec и почему он у меня не работает?
>
> У тебя не работает потому, что exec не разбирает $r на отдельные
> параметры (и правильно, не его это дело), а ip хочет, чтобы via,
> 192.168.0.1, dev и eth0 были отдельными параметрами.
>
> Когда ты выкручиваешься, ты поручаешь разбор строки на отдельные
> параметры шеллу. Можно сделать это самостоятельно - eval exec $IP route
> del default $r.

Пробовал я через eval. Все равно не работает.
Пробовал и разобрать на параметры и скормить отдельно.
И не работает :(
tcl 8.4.9-1 (Debian Sarge)
Загадка какая-то :(

> Тогда ты поручишь разбор строки на отдельные параметры
> интерпретатору Tcl (eval рекурсивно зовет интерпретатор). Если бы у
> тебя при этом имя файла в $IP содержало пробелы (для команды это редко
> бывает надо, но бывает, а для прочих параметров регулярно),
> потребовалось бы сказать eval exec [list $IP] ... Hо в твоем случае
> слова пробелов не содержат, и можно без этого обойтись.

--

With Best Regards, Maxim Tyurin
JID: MrK...@jabber.pibhe.com

Artem Chuprina

unread,
Sep 19, 2007, 6:51:53 AM9/19/07
to
Maxim Tyurin -> Artem Chuprina @ Wed, 19 Sep 2007 09:02:16 +0000 (UTC):

>> MT> Hi!
>> MT> Что-то я не могу понять особенностей работы с exec :(
>> MT> Точнее как выполняется команда.
>> MT> Вот пример:
>> MT> set IP /sbin/ip
>> MT> set r "via 192.168.0.1 dev eth0"
>> MT> exec $IP route del default $r
>>
>> MT> на это мне выдается
>> MT> Error: either "to" is duplicate, or "via 192.168.0.1 dev eth0" is a garbage.
>>
>> MT> И никак я не могу запустить эту команду.
>>
>> MT> Пока выкрутился так:
>> MT> set command "$IP route del default $r"
>> MT> exec sh -c $command
>>
>> MT> Hо хотелось бы без костылей.
>>
>> MT> Где внятно расписано как работает exec и почему он у меня не работает?
>>
>> У тебя не работает потому, что exec не разбирает $r на отдельные
>> параметры (и правильно, не его это дело), а ip хочет, чтобы via,
>> 192.168.0.1, dev и eth0 были отдельными параметрами.
>>
>> Когда ты выкручиваешься, ты поручаешь разбор строки на отдельные
>> параметры шеллу. Можно сделать это самостоятельно - eval exec $IP route
>> del default $r.

MT> Пробовал я через eval. Все равно не работает.
MT> Пробовал и разобрать на параметры и скормить отдельно.
MT> И не работает :(
MT> tcl 8.4.9-1 (Debian Sarge)
MT> Загадка какая-то :(

zsh% tclsh
% set IP /sbin/ip
/sbin/ip
% set arg "ro ls"
ro ls
% exec $IP $arg
Object "ro ls" is unknown, try "ip help".
% eval exec $IP $arg
10.16.0.1 via 10.16.0.9 dev tun0
10.16.0.9 dev tun0 proto kernel scope link src 10.16.0.10
10.51.24.0/24 dev eth0 proto kernel scope link src 10.51.24.203
default via 10.51.24.1 dev eth0

Сравнивай с тем, "как обгонял, как подрезал".

--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: r...@jabber.ran.pp.ru

Все гениальное просто.
Hо со вкусом.
Кнышев.

Maxim Tyurin

unread,
Sep 19, 2007, 9:00:32 AM9/19/07
to
Artem Chuprina writes:

> Maxim Tyurin -> Artem Chuprina @ Wed, 19 Sep 2007 09:02:16 +0000 (UTC):

\skip

> MT> Пробовал я через eval. Все равно не работает.
> MT> Пробовал и разобрать на параметры и скормить отдельно.
> MT> И не работает :(
> MT> tcl 8.4.9-1 (Debian Sarge)
> MT> Загадка какая-то :(
>
> zsh% tclsh
> % set IP /sbin/ip
> /sbin/ip
> % set arg "ro ls"
> ro ls
> % exec $IP $arg
> Object "ro ls" is unknown, try "ip help".
> % eval exec $IP $arg
> 10.16.0.1 via 10.16.0.9 dev tun0
> 10.16.0.9 dev tun0 proto kernel scope link src 10.16.0.10
> 10.51.24.0/24 dev eth0 proto kernel scope link src 10.51.24.203
> default via 10.51.24.1 dev eth0
>
> Сравнивай с тем, "как обгонял, как подрезал".

Большое спасибо. Работает.

Появился еще один вопрос ;)
Hасколько я понимаю eval делает дополнительный вызов интерпретатора
тикля. Интерпретатор тикля достаточно тяжел.
Hе будет ли вызов шела более легковесным?
Или eval более хитро работает?

Artem Chuprina

unread,
Sep 19, 2007, 9:53:04 AM9/19/07
to
Maxim Tyurin -> Artem Chuprina @ Wed, 19 Sep 2007 13:00:32 +0000 (UTC):

>> MT> Пробовал я через eval. Все равно не работает.
>> MT> Пробовал и разобрать на параметры и скормить отдельно.
>> MT> И не работает :(
>> MT> tcl 8.4.9-1 (Debian Sarge)
>> MT> Загадка какая-то :(
>>
>> zsh% tclsh
>> % set IP /sbin/ip
>> /sbin/ip
>> % set arg "ro ls"
>> ro ls
>> % exec $IP $arg
>> Object "ro ls" is unknown, try "ip help".
>> % eval exec $IP $arg
>> 10.16.0.1 via 10.16.0.9 dev tun0
>> 10.16.0.9 dev tun0 proto kernel scope link src 10.16.0.10
>> 10.51.24.0/24 dev eth0 proto kernel scope link src 10.51.24.203
>> default via 10.51.24.1 dev eth0
>>
>> Сравнивай с тем, "как обгонял, как подрезал".

MT> Большое спасибо. Работает.

MT> Появился еще один вопрос ;)
MT> Hасколько я понимаю eval делает дополнительный вызов интерпретатора
MT> тикля. Интерпретатор тикля достаточно тяжел.
MT> Hе будет ли вызов шела более легковесным?
MT> Или eval более хитро работает?

Тяжел, но уже загружен в память. Он не отдельный процесс tclsh
запускает, а именно отдельный интерпретатор в рамках того же процесса.
Это дешево, благо вся инициализация, в сущности, уже проделана.

Впрочем, tclsh как таковой, если не подгружать хмурой тучи библиотек,
сдается мне, легче типичного шелла, если учитывать mmap(). Уж bash'а-то
точно. busybox какой, может, и полегче будет...

А уж парсер у tcl на порядки проще, чем у sh.

--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: r...@jabber.ran.pp.ru

А рафинированных эстетов на праздник жизни не приглашали.
Ольга Брилева в <bcthqq$29$38...@www.fido-online.com>

Maxim Tyurin

unread,
Sep 19, 2007, 11:00:34 AM9/19/07
to
Artem Chuprina writes:
\skip

> MT> Появился еще один вопрос ;)
> MT> Hасколько я понимаю eval делает дополнительный вызов интерпретатора
> MT> тикля. Интерпретатор тикля достаточно тяжел.
> MT> Hе будет ли вызов шела более легковесным?
> MT> Или eval более хитро работает?
>
> Тяжел, но уже загружен в память. Он не отдельный процесс tclsh
> запускает, а именно отдельный интерпретатор в рамках того же процесса.
> Это дешево, благо вся инициализация, в сущности, уже проделана.
>
> Впрочем, tclsh как таковой, если не подгружать хмурой тучи библиотек,
> сдается мне, легче типичного шелла, если учитывать mmap(). Уж bash'а-то
> точно. busybox какой, может, и полегче будет...
>
> А уж парсер у tcl на порядки проще, чем у sh.

Спасибо, теперь понятно.
Проверил, вызов через /bin/sh гораздо медленнее (учитывая что в
основном /bin/sh ссылка на /bin/bash в большинстве дистрибутивов :)

0 new messages