ดังนั้นการรวมคำตอบจาก @gilles และ @ bruno-a (และกลอุบายอื่น ๆ อีกสองสามรายการ) ฉันจึงคิดคำตอบหนึ่งซับซึ่งจะลบ (ทุก ๆ ) REMOVE_PART ออกจาก PATH โดยไม่คำนึงว่ามันจะเกิดขึ้นที่จุดเริ่มต้นหรือไม่ กึ่งกลางหรือจุดสิ้นสุดของ PATH
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
มันค่อนข้างเทอะทะ แต่ก็ดีที่สามารถทำได้ในการเข้าชมครั้งเดียว การ;
ใช้เพื่อรวมคำสั่ง sed สองคำด้วยกัน:
s@:$REMOVE_PART:@:@g
(ซึ่งแทนที่:$REMOVE_PART:
ด้วยอันเดียว:
)
s@^:\(.*\):\$@\1@
(ซึ่งปิดโคลอนนำหน้าและต่อท้ายที่เราเพิ่มด้วยคำสั่ง echo)
และตามบรรทัดที่คล้ายกันฉันเพิ่งจะเกิดขึ้นกับหนึ่งซับสำหรับการเพิ่ม ADD_PART ไปที่เส้นทางเฉพาะในกรณีที่เส้นทางไม่ได้มีอยู่แล้ว
PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi')
เปลี่ยนส่วนสุดท้ายเป็นecho "$PATH:$ADD_PART"
หากคุณต้องการเพิ่ม ADD_PART ที่ส่วนท้ายของ PATH แทนที่จะเป็นจุดเริ่มต้น
...
... หรือเพื่อให้ง่ายยิ่งขึ้นให้สร้างสคริปต์ที่remove_path_part
มีเนื้อหา
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
และสคริปต์ที่prepend_path_part
มีเนื้อหา
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
และสคริปต์ที่append_path_part
มีเนื้อหา
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
ทำให้พวกเขาทั้งหมดที่ปฏิบัติการได้แล้วเรียกพวกเขาเช่น:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
เรียบร้อยแม้ว่าฉันจะพูดอย่างนั้น :-)