zshでの$ pathと$ PATH(小文字と大文字)の違いは何ですか?


12

では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

1つの出力はSPACE文字で区切られ、もう1つの出力はCOLON文字で区切られます。

➥なぜ違いがあるのですか?

これらの2つの異なる別個の変数はありますか?または、小文字/大文字は、私が知らない何らかのトリックまたは意味を引き起こしますか?

これはzsh機能ですか?または、FreeBSDの機能ですか?


1
余談:POSIX準拠のシェルでは、小文字を使用した変数名はアプリケーションの使用に対して安全であることが保証されています(変更時にシェルまたはシステムの動作を静かに変更することはありません)。これは、標準化された保証が適用されないため、スクリプト作成者にとって頭痛の種になる可能性があるzshの決定が、彼らにとって意味のある標準に従うだけの場所の1つです。
チャールズダフィー

@CharlesDuffyあなたは、小文字と大文字の変数についてのいずれかを言う標準の部分へのリンクを持っていますか?ありがとう。
mosvy

@mosvy、pubs.opengroup.org / onlinepubs/ 9699919799 / basedefs/ -シェル変数と環境変数が単一の名前空間を共有していることに注意して読んでください(シェル変数を設定すると、既存の同様の名前の環境変数の値が更新されます。環境変数を設定すると、シェル変数が初期化されます)。特定の行:小文字を含む環境変数名の名前空間は、アプリケーション用に予約されています。アプリケーションは、標準ユーティリティの動作を変更せずに、この名前空間の名前で環境変数を定義できます。
チャールズダフィー

@CharlesDuffyここでは当てはまりません。path内部で設定してzshpathenvvar:は更新されませんpath=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
mosvy

@mosvy、あなたはそれが規格の文字に違反しないことを私に納得させました。精神は、他の一方で、になるだろうfor path in "$dir"/*反射的に安全への書き込みコード。
チャールズダフィー

回答:


19

これzshcsh/ から継承された機能ですtcsh

$path 配列変数をされ縛ら$PATH スカラー(文字列)変数。一方の変更は、もう一方に反映されます。

zsh(に反して(t)csh)、あなたは横に他の変数を結び付けることができ$PATHtypeset -T。コロンで区切られたスカラーには大文字の名前を使用し、配列には小文字で同じ名前を使用するのが慣例ですが、必須ではありません。コロンはデフォルトのセパレータですが、他のセパレータを使用することもできます(たとえば、複数行の文字列を配列に結び付ける改行、またはCSV行を配列に結び付けるコンマなど)

の最近のバージョンではzshtypeset -p PATHまたはtypeset -p path2つの変数間のリンクが表示されます。

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

これは、削除コンポーネントの追加やそれらのループを簡単に行えるという点で便利です。

こうtypeset -U path要素を作るためにユニークなことも維持することができます$PATH(同様の何かがで達成することができる変数クリーンをtcsh持ちますset -f)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.