Discussion:
Особенности exec
(слишком старое сообщение для ответа)
Maxim Tyurin
2007-09-19 00:10:52 UTC
Permalink
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: ***@jabber.pibhe.com
Artem Chuprina
2007-09-19 07:29:58 UTC
Permalink
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: ***@jabber.ran.pp.ru

Рюкзак не пересобирают, рюкзак укладывают! (c)Руна
Maxim Tyurin
2007-09-19 09:02:16 UTC
Permalink
Post by Artem Chuprina
MT> Hi!
MT> Что-то я не могу понять особенностей работы с exec :(
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> 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)
Загадка какая-то :(
Post by Artem Chuprina
Тогда ты поручишь разбор строки на отдельные параметры
интерпретатору Tcl (eval рекурсивно зовет интерпретатор). Если бы у
тебя при этом имя файла в $IP содержало пробелы (для команды это редко
бывает надо, но бывает, а для прочих параметров регулярно),
потребовалось бы сказать eval exec [list $IP] ... Hо в твоем случае
слова пробелов не содержат, и можно без этого обойтись.
--
With Best Regards, Maxim Tyurin
JID: ***@jabber.pibhe.com
Artem Chuprina
2007-09-19 10:51:53 UTC
Permalink
Post by Artem Chuprina
MT> Hi!
MT> Что-то я не могу понять особенностей работы с exec :(
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> 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: ***@jabber.ran.pp.ru

Все гениальное просто.
Hо со вкусом.
Кнышев.
Maxim Tyurin
2007-09-19 13:00:32 UTC
Permalink
\skip
Post by Artem Chuprina
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 более хитро работает?
--
With Best Regards, Maxim Tyurin
JID: ***@jabber.pibhe.com
Artem Chuprina
2007-09-19 13:53:04 UTC
Permalink
Post by Artem Chuprina
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: ***@jabber.ran.pp.ru

А рафинированных эстетов на праздник жизни не приглашали.
Ольга Брилева в <bcthqq$29$***@www.fido-online.com>
Maxim Tyurin
2007-09-19 15:00:34 UTC
Permalink
Artem Chuprina writes:
\skip
Post by Artem Chuprina
MT> Появился еще один вопрос ;)
MT> Hасколько я понимаю eval делает дополнительный вызов интерпретатора
MT> тикля. Интерпретатор тикля достаточно тяжел.
MT> Hе будет ли вызов шела более легковесным?
MT> Или eval более хитро работает?
Тяжел, но уже загружен в память. Он не отдельный процесс tclsh
запускает, а именно отдельный интерпретатор в рамках того же процесса.
Это дешево, благо вся инициализация, в сущности, уже проделана.
Впрочем, tclsh как таковой, если не подгружать хмурой тучи библиотек,
сдается мне, легче типичного шелла, если учитывать mmap(). Уж bash'а-то
точно. busybox какой, может, и полегче будет...
А уж парсер у tcl на порядки проще, чем у sh.
Спасибо, теперь понятно.
Проверил, вызов через /bin/sh гораздо медленнее (учитывая что в
основном /bin/sh ссылка на /bin/bash в большинстве дистрибутивов :)
--
With Best Regards, Maxim Tyurin
JID: ***@jabber.pibhe.com
Loading...