$PATH vs. $путь
Не могу вспомнить почему, но давным-давно я обнаружил, что по какой-то причине мне нужно установить обе эти переменные. В bash это не вызвало проблем, но теперь в zsh, когда я поставил
export PATH=~/bin:/opt/local/bin:/opt/local/sbin:$PATH export path=$PATH
(то же самое, что я использовал в .bashrc) при инициализации, я получаю
/Users/…/.zshenv:export:7: path: inconsistent type for assignment
Что они подразумевают под «типом» и для чего используется $ path?
Ответы
Ошибка с упоминанием «тип» относится к типу данных переменной, например, строке или массиву.
$PATHэто строка, $pathэто массив. Вы не можете присвоить строку, будь то переменная или литерал, переменной, типизированной для хранения массива, поскольку типы не совпадают.
Что касается разницы между двумя переменными: они предназначены для представления одного и того же списка папок, но в разных форматах. $PATHсодержащий /path/to/one:/path/to/twoбудет означать, что $pathпервый элемент есть, /path/to/oneа второй - /path/to/two.
Вам не нужно управлять двумя переменными (и присвоение одной другой не сработает, поскольку типы не совпадают) - оболочка должна обрабатывать это за вас. Просто добавьте к $PATHстроке, и добавленный путь должен существовать как элемент $path.
Это применимо только в zshунаследованном от *csh. Вы можете увидеть «привязку» между двумя переменными с помощью typeset -p PATH.
$path быть массивом действительно удобно:
добавление и изменение пути может быть выполнено с помощью операций с массивом, таких как добавление, а не манипуляций со строкой (требуя разделения и объединения в случае редактирования где-то посередине).
перебор просто
for i ($path) { … }без необходимости иметь дело с установкой правильного символа разделения.
PATH - это скалярное значение - непрерывная строка путей поиска, разделенных двоеточиями, а path - это массив путей поиска. zshсинхронизирует как путь, так и ПУТЬ. В этом нет необходимости.