ความแตกต่างระหว่าง $ 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 ที่จะปฏิบัติตามมาตรฐานที่เหมาะสมเท่านั้นที่พวกเขาสามารถสร้างความปวดหัวให้กับผู้เขียนบทเพราะการรับรองมาตรฐานไม่ได้ใช้
Charles Duffy

@CharlesDuffy คุณมีลิงค์ไปยังส่วนหนึ่งของมาตรฐานที่มันบอกอะไรเกี่ยวกับตัวแปรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่? ขอบคุณ
mosvy

@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/ … - โปรดจำไว้ว่าเชลล์และตัวแปรสภาพแวดล้อมแชร์เนมสเปซเดียว (การตั้งค่าตัวแปรเชลล์จะอัปเดตค่าของตัวแปรสภาพแวดล้อมที่มีชื่อเหมือนกัน; การตั้งค่าตัวแปรสภาพแวดล้อมเริ่มต้นตัวแปรเชลล์) บรรทัดที่เฉพาะเจาะจง: พื้นที่ชื่อของชื่อตัวแปรสภาพแวดล้อมที่มีตัวอักษรตัวพิมพ์เล็กถูกสงวนไว้สำหรับการใช้งาน แอปพลิเคชันสามารถกำหนดตัวแปรสภาพแวดล้อมใด ๆ ด้วยชื่อจากพื้นที่ชื่อนี้โดยไม่ต้องปรับเปลี่ยนพฤติกรรมของยูทิลิตี้มาตรฐาน
Charles Duffy

@CharlesDuffy นั่นไม่ได้ใช้ที่นี่ การตั้งค่าpathภายในzshจะไม่ปรับปรุงใด ๆenvvar:path path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
mosvy

@mosvy คุณทำให้ฉันเชื่อว่ามันไม่ได้ละเมิดจดหมายมาตรฐาน ในทางกลับกันวิญญาณจะสร้างรหัสที่for path in "$dir"/*ปลอดภัยต่อการเขียนอย่างละเอียด
Charles Duffy

คำตอบ:


20

นั่นคือคุณลักษณะของzshมรดกจาก/cshtcsh

$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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.