Quindi, combinando le risposte di @gilles e @ bruno-a (e un paio di altri trucchi per sed) ho ideato questo one-liner, che rimuoverà (ogni) REMOVE_PART da PATH, indipendentemente dal fatto che si verifichi all'inizio, metà o fine del PERCORSO
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
È un po 'ingombrante, ma è bello poterlo fare in un colpo solo. La ;
viene utilizzato per unire insieme i due comandi separati sed:
s@:$REMOVE_PART:@:@g
(che sostituisce :$REMOVE_PART:
con un singolo :
)
s@^:\(.*\):\$@\1@
(che rimuove i due punti iniziali e finali aggiunti con il comando echo)
E seguendo linee simili, sono appena riuscito a trovare questo one-liner per aggiungere un ADD_PART al PERCORSO, solo se il PERCORSO non lo contiene già
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')
Modificare l'ultima parte in echo "$PATH:$ADD_PART"
se si desidera aggiungere ADD_PART alla fine di PATH anziché all'inizio.
...
... o per renderlo ancora più semplice, crea uno script chiamato remove_path_part
con il contenuto
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
e uno script chiamato prepend_path_part
con il contenuto
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
e uno script chiamato append_path_part
con il contenuto
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
rendili tutti eseguibili e quindi chiamali come:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Pulito, anche se lo dico io stesso :-)