2011-12-19 1 views
1

Все,давая ЗШ попробовать - первая загадка:

Disgusted как я с Баш, я думал, что я дам ЗШ попробовать, это, кажется, хорошо говорил. Так, сразу же я столкнулся с этой кирпичной стены:

function z 
{ 
    var="ls -l" 
    "$var" 
} 

В Баш, который будет выполнять команду «Ls -l», в Zsh это дает мне «команда не найдена: Ls -l» Как я «Абсолютно сырой с zsh, я понятия не имею, что может быть другим между ним и bash, что приведет к вышесказанному.

+0

В Баш это дает ту же ошибку. – Jens

ответ

4

(я предполагаю, что вы имели в виду $var на том, что следующий к последней строке, а не "$var".)

Zsh не стремится быть полностью совместимы с традиционными оболочками Bourne. Основным несовместимым изменением между sh и zsh является то, что некоторая подстановка параметров ($var) претерпевает разделение поля и генерация имени файла (globbing) в sh (и ksh и bash), но не в zsh. В zsh $var всегда расширяется до одного слова (если var не является переменной массива), здесь ls -l, тогда как в sh $var будет расширяться до двух слов ls l-.

Вы можете заставить разделение полей на результате расширения в Zsh, написав $=var, и вы можете заставить имя файла поколения, написав $~var ($~=var или $=~var расширяющихся оба). Это редко необходимо; обычно, если вам нужно, чтобы расширение было несколько слов, вы сохранили бы несколько слов в переменной.

Смотрите также What is word splitting? Why is it important in shell programming?

+0

Спасибо. Знаешь, пытаясь привыкнуть к тому, как это делается, это будет «больно хорошо», чтобы отучить это и сделать это здоровым. –

2

Это также даст вам команду, не найденную в bash, просто потому, что, используя кавычки, вы запрещаете интерполяцию (как ее называет ручка Perl) или переразделите содержимое $ var. Следовательно, с «$ var» существует не более одного аргумента, и один аргумент будет состоять из $ var.

+0

Ах! совершенно правильно, в bash мне пришлось оставить цитаты. Но в zsh –

+0

(черт возьми, забудьте, что «вводит» сообщения комментарий) ... но в zsh, если var = «ls» (одно слово), то он будет выполняться, но только с «$ var», указанным, поэтому я цитировал это выше. –