Vì vậy, kết hợp các câu trả lời từ @gilles và @ bruno-a (và một vài thủ thuật quyến rũ khác) tôi đã đưa ra cách sử dụng một lớp lót này, nó sẽ loại bỏ (mọi) REMISE_PART khỏi PATH, bất kể nó có xảy ra lúc đầu không, giữa hoặc cuối của PATH
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
Hơi khó sử dụng một chút, nhưng thật tuyệt khi có thể làm điều đó trong một cú đánh. Các ;
được sử dụng để tham gia cùng hai lệnh sed riêng biệt:
s@:$REMOVE_PART:@:@g
(thay thế :$REMOVE_PART:
bằng một :
)
s@^:\(.*\):\$@\1@
(loại bỏ các dấu hai chấm hàng đầu và dấu mà chúng ta đã thêm bằng lệnh echo)
Và dọc theo các dòng tương tự, tôi vừa mới tìm ra được một lớp lót này để thêm ADD_PART vào PATH, chỉ khi PATH không chứa nó
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')
Thay đổi phần cuối cùng thành echo "$PATH:$ADD_PART"
nếu bạn muốn thêm ADD_PART vào cuối PATH thay vì bắt đầu.
...
... Hoặc để làm cho điều này thậm chí dễ dàng hơn, hãy tạo một tập lệnh được gọi remove_path_part
với nội dung
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
và một kịch bản được gọi prepend_path_part
với nội dung
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
và một kịch bản được gọi append_path_part
với nội dung
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
làm cho tất cả chúng có thể thực thi được, và sau đó gọi chúng như:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Gọn gàng, ngay cả khi tôi tự nói như vậy :-)