Итак, комбинируя ответы от @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)
Аккуратно, даже если я сам так скажу :-)