$PATH vs. $путь

Sep 06 2020

Не могу вспомнить почему, но давным-давно я обнаружил, что по какой-то причине мне нужно установить обе эти переменные. В 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?

Ответы

8 grg Sep 06 2020 at 04:09

Ошибка с упоминанием «тип» относится к типу данных переменной, например, строке или массиву.

$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) { … }без необходимости иметь дело с установкой правильного символа разделения.

3 fd0 Sep 06 2020 at 04:04

PATH - это скалярное значение - непрерывная строка путей поиска, разделенных двоеточиями, а path - это массив путей поиска. zshсинхронизирует как путь, так и ПУТЬ. В этом нет необходимости.