$ {PATH: +: $ {PATH}} หมายถึงอะไร


24

ฉันเพิ่งสังเกตเห็นสิ่งต่อไปนี้ในโปรไฟล์ cygwin ของฉันแม่นยำยิ่งขึ้น:

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

มันหมายความว่าอะไร? ทำไมไม่ใช่แค่ $ PATH นี่คือ 'ถ้า $ PATH มีอยู่แล้วเพิ่ม: $ PATH' หรือไม่ จุดประสงค์ของฉันคือการสลับลำดับและวางเส้นทาง cygwin ที่อยู่ด้านหลังหน้าต่างเส้นทาง ในอดีตฉันจะมี

$PATH:/usr/local/bin:/usr/bin

แต่สิ่งนี้ทำให้ฉันสับสน บางทีฉันควรจะทำ

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

การผนวก: เมื่อสิ้นสุด $ PATH?


1
ชื่อคำถามของคุณยุ่งมากกับการจัดรูปแบบในแถบด้านข้างของคำถามยอดนิยมทางทิศตะวันออกของi.imgur.com/g6pPmzf.png
Brad

คำตอบ:


38

:+เป็นรูปแบบของการขยายตัวพารามิเตอร์ :

$ {พารามิเตอร์: + [คำ]} : ใช้ค่าทางเลือก

หากพารามิเตอร์ไม่ได้ตั้งค่าหรือเป็นโมฆะ null จะถูกทดแทน; มิฉะนั้นการขยายตัวของคำ (หรือสตริงที่ว่างถ้าคำถูกละเว้น) จะถูกแทนที่

กล่าวอีกนัยหนึ่งถ้าตัวแปร$varถูกกำหนดไว้echo ${var:+foo}จะพิมพ์fooและหากไม่เป็นเช่นนั้นตัวแปรนั้นจะพิมพ์สตริงว่าง

ประการที่สอง:ไม่มีอะไรพิเศษ $PATHมันเป็นตัวละครที่ใช้เป็นตัวคั่นในรายชื่อของไดเรกทอรีใน ดังนั้นPATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"เป็นวิธีการเขียนชวเลข:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

เป็นเพียงเคล็ดลับที่ชาญฉลาดเพื่อหลีกเลี่ยงการเพิ่มส่วนเกิน:เมื่อ$PATHไม่ได้ตั้งค่า ตัวอย่างเช่น:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

แต่ถ้าPATHunset:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

ด้วยตัวเองเพิ่มไดเรกทอรีปัจจุบันไป: หลีกเลี่ยง$PATHการใช้PATH="/new/dir${PATH:+:$PATH}"สิ่งนี้ ดังนั้นคุณสามารถใช้PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"ถ้าคุณต้องการหรือคุณสามารถใช้PATH="$PATH:/usr/local/bin:/usr/bin"ถ้าคุณต้องการ แตกต่างเพียงว่าอดีตอาจเพิ่มเป็นพิเศษดังนั้นการเพิ่มไดเรกทอรีปัจจุบันของคุณไป:$PATH


:อันตรายเป็นพิเศษหรือไม่?
แมว

4
@tac ไม่จริงเพียงเพิ่มไดเรกทอรีปัจจุบันของคุณ$PATH(ดูคำตอบ @ AndyB ของ) นั่นอาจเป็นความเสี่ยงด้านความปลอดภัยในบางสถานการณ์ (บอกว่าผู้โจมตีได้อัปโหลดสคริปต์ทำลายลงในไดเรกทอรีปัจจุบันของคุณและตั้งชื่อlsหรือบางสิ่งบางอย่าง) แต่ในกรณีส่วนใหญ่คุณไม่สนใจ ในความเป็นจริงบางระบบเพิ่มไดเรกทอรีปัจจุบันไปPATHตามค่าเริ่มต้น
terdon

เส้นทางเป็นที่เดียวที่ฉันต้องการให้พวกเขาcshจัดการกับมันเป็นอาร์เรย์
hometoast

8

คุณถูกต้องหมายความว่า 'หากมี $ PATH อยู่ - และไม่ใช่ null - จากนั้นเพิ่ม: $ PATH'

คุณต้องตรวจสอบว่ามี $ PATH อยู่หรือไม่เพราะคุณไม่ต้องการเพิ่มโคลอนนำหน้า (หรือต่อท้าย) หากไม่ระบุ $ PATH ความยาวเป็นศูนย์ (null) ชื่อไดเรกทอรีในเส้นทางดังเช่นใน:/usr/local/bin:/usr/binหรือ/usr/local/bin:/usr/bin:หรือ/usr/local/bin::/usr/binหมายถึงการค้นหาไดเรกทอรีปัจจุบัน

คัดลอกมาจากman bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

นั่นอาจไม่ใช่สิ่งที่คุณต้องการทำ

สองบรรทัดต่อไปนี้ทำสิ่งเดียวกัน:

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