Apa perbedaan antara $ path dan $ PATH (huruf kecil versus huruf besar) dengan zsh?

12

Dalam FreeBSD 12, menggunakan zshshell, saya melihat perbedaan ini ketika melihat $path(huruf kecil) versus $PATH(huruf besar).

echo $path

/ sbin / bin / usr / sbin / usr / bin / usr / lokal / sbin / usr / lokal / bin / usr / home / freebsd / bin

echo $PATH

/ sbin: / bin: / usr / sbin: / usr / bin: / usr / local / sbin: / usr / local / bin: / usr / home / freebsd / bin

Satu output dibatasi oleh karakter SPACE, yang lainnya oleh karakter COLON.

➥ Mengapa bedanya?

Apakah kedua variabel ini berbeda dan terpisah? Atau apakah huruf kecil / huruf besar memicu semacam trik atau makna yang tidak saya ketahui?

Apakah ini zshfitur? Atau fitur FreeBSD?

Basil Bourque
sumber
1
Selain itu: Dalam setiap shell yang mendukung POSIX, nama variabel dengan karakter huruf kecil dijamin aman untuk penggunaan aplikasi (tidak untuk secara diam-diam memodifikasi shell atau perilaku sistem ketika diubah). Ini adalah salah satu tempat di mana keputusan zsh untuk hanya mengikuti standar di mana masuk akal bagi mereka dapat membuat sakit kepala bagi penulis skrip, karena jaminan standar tidak berlaku.
Charles Duffy
@CharlesDuffy apakah Anda memiliki tautan ke bagian standar di mana dikatakan semua itu tentang variabel huruf besar dan kecil? Terima kasih.
Mosvy
@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - baca dengan mengingat bahwa variabel shell dan lingkungan berbagi namespace tunggal (pengaturan variabel shell memperbarui nilai variabel lingkungan seperti-nama yang ada; pengaturan variabel lingkungan menginisialisasi variabel shell). Baris spesifik: Ruang nama nama variabel lingkungan yang berisi huruf kecil disediakan untuk aplikasi. Aplikasi dapat mendefinisikan variabel lingkungan apa pun dengan nama dari ruang nama ini tanpa mengubah perilaku utilitas standar.
Charles Duffy
@CharlesDuffy Itu tidak berlaku di sini. Pengaturan pathdalam zshtidak akan memperbarui pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
Mosvy
@ Mosvy, Anda telah meyakinkan saya bahwa itu tidak melanggar surat standar. The semangat , di sisi lain, akan membuat for path in "$dir"/*refleks aman-untuk-menulis kode.
Charles Duffy

Jawaban:

19

Itu fitur yang zshdiwarisi dari csh/ tcsh.

The $path Array variabel terikat dengan $PATH skalar (string) variabel. Setiap modifikasi pada satu tercermin pada yang lain.

Dalam zsh(bertentangan dengan (t)csh), Anda dapat mengikat variabel lain selain $PATHdengan typeset -T. Itu konvensional, tetapi tidak wajib, untuk menggunakan nama huruf besar untuk skalar yang dipisahkan titik dua dan nama yang sama dalam huruf kecil untuk array. Sementara titik dua adalah pemisah default, pemisah lainnya dapat digunakan (misalnya baris baru untuk mengikat string multi-baris ke array, atau koma untuk mengikat baris csv ke array)

Dalam versi terbaru dari zsh, typeset -p PATHatau typeset -p pathmenunjukkan tautan antara dua variabel:

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

Itu berguna karena membuatnya lebih mudah untuk menambahkan menghapus komponen atau mengulanginya.

Melakukan typeset -U pathuntuk membuat elemen unik juga membantu menjaga $PATHvariabel tetap bersih (sesuatu yang serupa dapat dicapai tcshdengan set -f).

Stéphane Chazelas
sumber