В FreeBSD 12, используя zsh
оболочку, я заметил эту разницу, когда смотрю на $path
(строчные буквы) и $PATH
(прописные).
echo $path
/ sbin / bin / usr / sbin / usr / bin / usr / local / sbin / usr / local / bin / usr / home / freebsd / bin
echo $PATH
/ SBIN: / бен: / USR / SBIN: / USR / бен: / USR / местные / SBIN: / USR / местные / бен: / USR / дома / FreeBSD / бен
Один вывод ограничен символом пробела, другой - символом COLON.
➥ Почему разница?
Это две разные, отдельные переменные? Или строчная / прописная буква вызывает какой-то фокус или смысл, о котором я не знаю?
Это zsh
особенность? Или особенность FreeBSD?
path
внутриzsh
не будет обновлять какие - либоpath
envvar:path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
.for path in "$dir"/*
рефлексивно безопасный код для записи.Ответы:
Это особенность,
zsh
унаследованная отcsh
/tcsh
.$path
Массив переменная привязана к$PATH
скалярной (строка) переменной. Любая модификация одного отражается в другом.В
zsh
(вопреки(t)csh
) вы можете связать другие переменные$PATH
сtypeset -T
. Обычно, но не обязательно, использовать имя в верхнем регистре для скаляра, разделенного двоеточиями, и то же имя в нижнем регистре для массива. Хотя двоеточие является разделителем по умолчанию, могут использоваться другие разделители (например, символ новой строки для привязки многострочной строки к массиву или запятая для привязки строки csv к массиву)В последних версиях
zsh
,typeset -p PATH
илиtypeset -p path
показывает связь между двумя переменными:Это полезно тем, что облегчает добавление удаляемых компонентов или их циклическую обработку.
Выполнение a,
typeset -U path
чтобы сделать элементы уникальными, также помогает поддерживать$PATH
переменную в чистоте (что-то подобное может быть достигнутоtcsh
с помощьюset -f
).источник