[112350] Следующие три фрагмента оболочки эквивалентны (т.е. они выполняют одно и то же, и вы должны копаться в них, чтобы заметить любой другой эффект):
Все они устанавливают переменную окружения [112771] COLUMNS[112772] на значение [112773]%s[112774] для вызова команды [112775]ps[112776]. В командной оболочке значение [112777]COLUMNS[112778], если таковое имеется, остается таким же, как и раньше. Первый фрагмент выполняет этот эффект через внешнюю программу [112779]env[112780], второй - с использованием чистого синтаксиса оболочки, третий - с помощью сборки оболочки [112781] export[112782] в сочетании с конструкцией [112783](...)[112784] subhell. Это отличается от
, которая устанавливает переменную окружения [112785]COLUMNS[112786] таким образом, что она остается в силе в оставшейся части скрипта, и от
, которая в отличие от других устанавливает только переменную оболочки (которую [112787]ps[112788] не увидит), но не экспортирует [112789]COLUMNS[112790] в оболочку окружения. (Однако, если [112791]COLUMNS[112792] уже присутствовал в окружении, то установлено значение [112793]%s[112794]. )
Программа [112795]env[112796] может выглядеть бесполезной, но она существует
потому что старше конструкции оболочки [113044]VAR=value command[113045];
потому что она полезна в других случаях, например, когда программа запускает другую программу, не проходя через оболочку, и вы хотите установить несколько переменных окружения;
потому что она может работать с системами, которые имеют другую оболочку (e. g. в csh или Windows), если команда [113046]env[113047] доступна и в PATH.
Обратите внимание, что [112803]COLUMNS[112804] должен быть числом; [112805]ps[112806] игнорирует его, если он не числовой. Zsh даже отказывается устанавливать [112807]COLUMNS[112808] на нецифровое значение, поскольку по умолчанию он объявляет [112809]COLUMNS[112810] числовой переменной. В программе, которую вы цитируете, [112811]%s[112812] будет заменено на число перед использованием строки в качестве команды оболочки.[112367].