zsh и СТОЛБЦЫ

{
  printf "%s\t%s\n" Name Value
  grep -Po 'dbt_.+?=.*?(?=dbt_|$)' input_file | tr = '\t'
} > output_file
3
17.08.2013, 02:13
2 ответа

Как объяснил Stéphane Chazelas в комментарии, zshи =zshдают разные результаты, потому что у вас есть две версии zsh в разных каталогах. С env -i zshenvищет zshс неустановленным PATH, поэтому он ищет только в /usr/binи/bin(резервный путь )и выполняет /usr/bin/zsh. С помощью env -i =zshэкземпляр zsh, выполняющий команду env, расширяет=zshдо своего полного пути для текущего пути поиска (текущего значения PATH), то есть /usr/local/bin/zsh.

Разница в поведении возникает из-за фиксации 9af1cd47229041fda4dc07f0ef70691a64d49908 и, в частности, патча 30533 , который был выпущен непосредственно перед выпуском zsh 5.0.0. (Я нашел фиксацию, выполнив поиск COLUMNSв истории коммитов, и экспериментально подтвердил, что эта фиксация имеет значение.)

COLUMNS— это «волшебная» переменная, которая всегда обновляется до текущей ширины терминала. В zsh до 4.x настройки COLUMNSпытаются изменить размер терминала, но это никогда не работало правильно, и код для этого был удален в zsh 5.0.0. Следовательно, в современных версиях zsh настройка COLUMNSв интерактивной оболочке не имеет никакого эффекта, :она немедленно обновляется до ширины терминала. В более старых версиях установка числового значения, отличного от -, такого как пустая строка, имеет тот же эффект, что и установка переменной в 0, потому что значение должно быть целым числом.

1
27.01.2020, 21:44

Вот то, что происходит.

Во-первых, СТОЛБЦЫ, как можно знать, являются переменной, которая говорит ширину терминального экрана. Иногда оболочка устанавливает его для Вас, таким образом устанавливая его COLUMNS= может заставить оболочку обновлять значение к фактическому числу столбцов в терминале, который это обнаруживает.

Во-вторых, эта команда выполняет zsh и обрабатывает сценарий:

env -i zsh -flc '. ~/cols.sh'

В-третьих, эта команда выполняет другую оболочку (или тот же, от которого она выполняется, или значение $SHELL, я верю), и затем обрабатывает его; =zsh в значительной степени проигнорирован:

env -i =zsh -flc '. ~/cols.sh'

На самом деле это заставляет его быть похожим =zsh может на самом деле иметь эффект, но я не вижу, как это было бы полезно, поскольку я не полагаю, что любая оболочка поддерживает "пустое" имя переменной среды:

env -i =zsh env

Вывод =zsh, который подразумевает, что существует переменная без набора имени к zsh.

-1
27.01.2020, 21:44

Теги

Похожие вопросы