Яка різниця між $ path та $ PATH (малі та великі регістри) з zsh?


13

У 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: / bin: / usr / sbin: / usr / bin: / usr / local / sbin: / usr / local / bin: / usr / home / freebsd / bin

Один вихід обмежений символом SPACE, інший символом COLON.

➥ Чому різниця?

Це дві різні, окремі змінні? Або маленька / велика літера запускає якусь хитрість чи сенс, про який я не знаю?

Це zshособливість? Або особливість FreeBSD?


1
Убік: У будь-якій оболонці, сумісній з POSIX, імена змінних з будь-якими малі символи гарантовано безпечні для використання додатків (не мовчки змінювати поведінку оболонки чи системи при зміні). Це одне з місць, коли рішення zsh дотримуватися стандарту лише там, де їм це має сенс, може створити головний біль авторам сценаріїв, оскільки стандартизовані гарантії не застосовуються.
Чарльз Даффі

@CharlesDuffy Чи є у вас посилання на частину стандарту, де в ньому написано щось про нижню та верхню величину великого регістру? Дякую.
mosvy

@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - читайте це, маючи на увазі, що змінні оболонки та середовища поділяють єдиний простір імен (встановлення змінної оболонки оновлює значення будь-якої існуючої так званої змінної середовища; встановлення змінної середовища ініціалізує змінні оболонки). Конкретні рядки: Простір імен змінних імен середовища, що містять малі літери, зарезервований для програм. Програми можуть визначати будь-які змінні середовища з іменами з цього простору імен без зміни поведінки стандартних утиліт.
Чарльз Даффі

@CharlesDuffy Це не стосується тут. Установка pathвсередині zshНЕ буде оновлювати будь - яких pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy

@mosvy, ти переконав мене, що це не порушує букви стандарту. З іншого боку, дух зробив би for path in "$dir"/*рефлекторно безпечний для запису код.
Чарльз Даффі

Відповіді:


20

Це особливість zshуспадкованого від csh/ tcsh.

$path Масив змінна прив'язана до $PATH скалярної (рядок) змінної. Будь-яка модифікація на одній відображається в іншій.

У zshпротилежному випадку (t)cshви можете пов'язати інші змінні поряд $PATHіз typeset -T. Умовно, але не обов’язково, використовувати великі назви для скаляр, розділених двокрапкою, та те саме ім'я в малій лінійці для масиву. Хоча двокрапка - це роздільник за замовчуванням, можна використовувати інші роздільники (наприклад, новий рядок для прив’язки багаторядкового рядка до масиву або кома для прив’язки рядка csv до масиву)

В останніх версіях zsh, typeset -p PATHабо typeset -p pathпоказує зв'язок між двома змінними:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

Це корисно тим, що полегшує додавання компонентів для видалення або циклу над ними.

Рухаємося , typeset -U pathщоб зробити елементи унікальної також допомагає підтримання $PATHзмінної в чистоті (що - щось подібне може бути досягнуто tcshз set -f).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.