Отож, поєднуючи відповіді від @gilles та @ bruno-a (та ще декількох інших трюків з sed), я придумав цей однокласник, який видалить (кожен) REMOVE_PART з 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, лише якщо PATH ще не містить його
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)
Акуратно, навіть якщо я сам так скажу :-)