[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: zsh



On Sat, Aug 02, 2008 at 11:12:10AM +0400, Artem Chuprina wrote:
> Stanislav Maslovski -> debian-russian@lists.debian.org  @ Sat, 2 Aug 2008 09:23:35 +0400:
> 
>  SM> Бог с ним, с эхо. Меня заинтересовало, что в ожидаемом мной
>  SM> контексте eval, в частности, когда я пытаюсь присвоить некое
>  SM> значение параметру TEST, я, к удивлению своему, обнаруживаю, что
>  SM> оно зависит от наличия или отсутствия в текущей директории
>  SM> какого-то не имеющего отношения к делу файла.
> 
> А до eval к этому моменту дело еще не дошло.  Это мы все еще раскрываем
> `./test`, выполнять результат мы еще не начали.

Угу.

> Проверить можно, заменив eval на : ("do nothing").
> 
> Вообще же обычно если хочется сделать eval выводу команды, то надо писать
> 
> eval "`cmd`"

Согласно документации на POSIX шелл:

"The eval utility shall construct a command by concatenating arguments
together, separating each with a <space>. The constructed command shall
be read and executed by the shell."

То есть, строго говоря, в общем случае двойные кавычки не обязательны.
Зависит от желаемого эффекта.

Но в _моем_примере_ двойные кавычки именно там и нужны.

> Парсить строку eval будет сам.  Хотя от GLOB_SUBST, согласно
> документации, это не спасает.

А ты проверил?

Если в моем примере делать так
% eval "`./test`"

то результат не подвергнется filename generation.
Внутри двойных кавычек "*" -- простой символ. 

==========================================================================
% cat ~/.zshenv     
setopt sh_option_letters sh_word_split glob_subst no_notify posix_builtins
% ls -l
total 4
-rw-r--r-- 1 stas stas  0 2008-08-02 11:59 TEST='111'
-rw-r--r-- 1 stas stas  0 2008-08-02 11:59 TEST='222'
-rwxr-xr-x 1 stas stas 26 2008-08-02 11:42 test
% ./test
TEST='*'
% eval `./test`
[stas@shota:/tmp/a]
% echo "$TEST"
222
% eval "`./test`"
% echo "$TEST" 
*
==========================================================================

-- 
Stanislav


Reply to: