การเพิ่มเส้นทางไปยัง PATH โดยใช้ไวยากรณ์หลายบรรทัด


16

เท่าที่ฉันเข้าใจวิธีปกติในการเพิ่มพา ธ ไปยังPATHตัวแปรสภาพแวดล้อมคือการเชื่อมโยงพา ธ ที่คั่นด้วย:อักขระ

ตัวอย่างเช่นถ้าผมต้องการที่จะเพิ่มอีกสามเส้นทางไป/my/path/1, /my/path/2และ/my/path/3ผมจะต้องทำดังนี้

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

ซึ่งอ่านไม่ง่าย

มีวิธีการกำหนดหรือเพิ่มเส้นทางไปยังPATHตัวแปรโดยใช้ไวยากรณ์หลายบรรทัดหรือไม่? อาจจะใช้อาร์เรย์? ฉันกำลังมองหาสิ่งนี้:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

ในกรณีที่มีวิธีแก้ปัญหาที่น่าสนใจที่เฉพาะเจาะจงของเชลล์ฉันกำลังมองหาวิธีแก้ปัญหาใน zsh

คำตอบ:


12

ฉันไม่ทราบว่ามันทำงานใน zsh แต่มันทำงานในทุบตี:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

แก้ไขและสั้นกว่า:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

และไม่มีการวางไข่กระบวนการ:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

คำพูดคู่ arround สำคัญ$PATH, $IFS, ${new_path[*]}และ$OLD_IFSเพื่อให้มีช่องว่างในการตีความตัวแปรและหลีกเลี่ยงเปลือกของไอเอฟเอ

Update2พร้อมความคิดเห็นและการจัดการบรรทัดว่างโดยใช้ sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

อักขระความคิดเห็นต้องเป็นอักขระตัวแรกบนบรรทัดและบรรทัดว่างควรว่างอย่างสมบูรณ์ ในการจัดการช่องว่างและแท็บก่อนแสดงความคิดเห็นและในบรรทัดว่างให้ใช้sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dแทน (แท็บที่จะทดสอบเนื่องจากอาจใช้เฉพาะกับการใช้งาน sed)


ฉันทดสอบตัวอย่างสุดท้ายใน zsh และใช้งานได้ ฉันก็ชอบที่มันสะอาดกว่าเดิมเล็กน้อย (อีกหนึ่งเส้นทางต่อบรรทัด) โซลูชันสามารถรองรับบรรทัดที่มีความคิดเห็น (เส้นทาง) ได้หรือไม่? แล้วเส้นที่ว่างเปล่าล่ะ?
Amelio Vazquez-Reina

อัปเดตด้วยความคิดเห็นและการจัดการสายว่าง
jfg956

และด้วยความใจเย็นหากคุณต้องการเล่นคุณสามารถหลีกเลี่ยงกระบวนการวางด้วยสคริปต์ที่ซับซ้อนมากขึ้น
jfg956

ตกลงเพื่อใช้การเยื้องสำหรับเส้นทางในpasteโซลูชันหรือไม่
void.pointer

20

ไม่ใช่วิธีแก้ปัญหาที่น่าสนใจ แต่สามารถพกพาได้:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
นี่เป็นสิ่งที่ฉันเห็นในช่วงหลายปีที่ผ่านมา หนึ่งสามารถเรียงลำดับเส้นทางใหม่ได้อย่างง่ายดายหรือแม้กระทั่งเปลี่ยนองค์ประกอบให้เป็น PATH = / my / path / 1: $ {PATH} เพื่อบังคับให้มีการจัดเตรียม
bsd

1
คุณสามารถใช้+=เพื่อหลีกเลี่ยงการสร้างสตริงใหม่ทั้งหมด
Chris Down

และคุณไม่จำเป็นต้องใช้เครื่องมือจัดฟันด้วยซ้ำ โคลอนไม่สามารถใช้ในชื่อตัวแปรสภาพแวดล้อมดังนั้นจึงไม่มีความชัดเจนในการแก้ไข
Alexios

+1 ที่ไม่น่าสนใจ บางครั้งสิ่งที่น่าสนใจอาจดี แต่นี่ไม่ใช่หนึ่งในนั้น! (โดยเฉพาะอย่างยิ่งตั้งแต่ OP ดังกล่าวอย่างชัดเจน "ไม่ง่ายต่อการอ่าน" เป็นปัญหา.)
ruakh

@ChrisDown มีไวยากรณ์ที่ prepends โดยไม่ต้องสร้างสตริงหรือไม่
จอห์น P

12

ใน zsh $pathคืออาร์เรย์:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

หมายเหตุ: ทั้งสองpathตัวพิมพ์เล็ก


ขึ้นอยู่กับเปลือกไม่ใช่ทั้งหมดจัดการ
vonbrand

1
@ vonbrand: ใช่ แต่ทำงานใน zsh ฉันคิดว่ามันคุ้มค่าที่จะพูดถึง
Kabie

3
+1 (คำถามนี้มีแท็กzsh )
Johnsyweb

ตั้งแต่ OP ถามถึง zsh โดยเฉพาะนี่เป็นตัวเลือกที่ดีที่สุด
Daniel Serodio

1
สำหรับทุกคนที่สนใจในการเรียนรู้เพิ่มเติมเกี่ยวกับ $ path กับ $ PATH distinction ตรวจสอบโพสต์นี้
mbigras

7

ใน zsh หากคุณกำลังเพิ่มไดเรกทอรีที่ส่วนท้ายของเส้นทาง:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Portably: วิธีเพิ่มเส้นทางไปยัง PATH อย่างถูกต้องได้อย่างไร

คุณสามารถใช้ตัวระบุแบบกลมเพื่อแยกรายการที่ไม่ใช่ไดเรกทอรีที่มีอยู่หรือลิงก์สัญลักษณ์ไปยัง สิ่งนี้อาจเป็นที่ต้องการหรือไม่ก็ได้ขึ้นอยู่กับว่าคุณคาดว่าจะเพิ่มไดเรกทอรีในภายหลังในระหว่างเซสชัน (เช่นถ้าอยู่ในระบบไฟล์ระยะไกล) คุณไม่สามารถทำเช่นนั้นด้วยpath+=/my/pathไวยากรณ์ได้เนื่องจากด้านขวาอยู่ในบริบทสตริงและดังนั้นจึงไม่ได้รับการโค้ง คุณสามารถทำได้ด้วยpath+=(/my/path)เนื่องจากแต่ละองค์ประกอบอาร์เรย์จะถูกขยายในบริบทรายการ

path+=(/path/to/app/{i386,share}/bin(-/N))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.