{
printf "%s\t%s\n" Name Value
grep -Po 'dbt_.+?=.*?(?=dbt_|$)' input_file | tr = '\t'
} > output_file
Как объяснил Stéphane Chazelas в комментарии, zsh
и =zsh
дают разные результаты, потому что у вас есть две версии zsh в разных каталогах. С env -i zsh
env
ищет 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, потому что значение должно быть целым числом.
Вот то, что происходит.
Во-первых, СТОЛБЦЫ, как можно знать, являются переменной, которая говорит ширину терминального экрана. Иногда оболочка устанавливает его для Вас, таким образом устанавливая его COLUMNS=
может заставить оболочку обновлять значение к фактическому числу столбцов в терминале, который это обнаруживает.
Во-вторых, эта команда выполняет zsh и обрабатывает сценарий:
env -i zsh -flc '. ~/cols.sh'
В-третьих, эта команда выполняет другую оболочку (или тот же, от которого она выполняется, или значение $SHELL, я верю), и затем обрабатывает его; =zsh
в значительной степени проигнорирован:
env -i =zsh -flc '. ~/cols.sh'
На самом деле это заставляет его быть похожим =zsh
может на самом деле иметь эффект, но я не вижу, как это было бы полезно, поскольку я не полагаю, что любая оболочка поддерживает "пустое" имя переменной среды:
env -i =zsh env
Вывод =zsh
, который подразумевает, что существует переменная без набора имени к zsh
.