Jadi, dengan menggabungkan jawaban dari @gilles dan @ bruno-a (dan beberapa trik sed lainnya), saya membuat one-liner ini, yang akan menghapus (setiap) REMOVE_PART dari PATH, terlepas dari apakah itu terjadi di awal, tengah atau akhir PATH
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
Agak sulit, tapi senang bisa melakukannya dalam satu pukulan. Ini ;
digunakan untuk bergabung bersama dua perintah sed terpisah:
s@:$REMOVE_PART:@:@g
(yang menggantikan :$REMOVE_PART:
dengan tunggal :
)
s@^:\(.*\):\$@\1@
(yang menghapus tanda titik dua utama dan akhir yang kami tambahkan dengan perintah echo)
Dan di sepanjang baris yang serupa, saya baru saja berhasil membuat satu-liner ini untuk menambahkan ADD_PART ke PATH, hanya jika PATH belum mengandungnya
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')
Ubah bagian terakhir menjadi echo "$PATH:$ADD_PART"
jika Anda ingin menambahkan ADD_PART ke akhir PATH daripada ke awal.
...
... atau untuk membuatnya lebih mudah, buat skrip yang disebut remove_path_part
dengan konten
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
dan sebuah skrip yang disebut prepend_path_part
dengan isinya
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
dan sebuah skrip yang disebut append_path_part
dengan isinya
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
buat semuanya dapat dieksekusi, lalu panggil mereka seperti:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Rapi, bahkan jika saya mengatakannya sendiri :-)