на это мне выдается
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
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 @ 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
>> 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 -> 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 более хитро работает?
>> 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>
Спасибо, теперь понятно.
Проверил, вызов через /bin/sh гораздо медленнее (учитывая что в
основном /bin/sh ссылка на /bin/bash в большинстве дистрибутивов :)