Removing a directory from PATH
There are no standard tools to "edit" the value of $PATH (i.e. "add folder only when it doesn't already exists" or "remove this folder"). You just execute:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
that would be for the current session, if you want to change permanently add it to any .bashrc, bash.bashrc, /etc/profile - whatever fits your system and user needs.
However if you're using BASH, you can also do the following if, let's say, you want to remove the directory /home/wrong/dir/
from your PATH variable, assuming it's at the end:
PATH=$(echo "$PATH" | sed -e 's/:\/home\/wrong\/dir$//')
So in your case you may use
PATH=$(echo "$PATH" | sed -e 's/:\/d\/Programme\/cygwin\/bin$//')
In bash:
directory_to_remove=/d/Programme/cygwin/bin
PATH=:$PATH:
PATH=${PATH//:$directory_to_remove:/:}
PATH=${PATH#:}; PATH=${PATH%:}
If you don't use an intermediate variable, you need to protect the /
characters in the directory to remove so that they aren't treated as the end of the search text.
PATH=:$PATH:
PATH=${PATH//:\/d\/Programme\/cygwin\/bin:/:}
PATH=${PATH#:}; PATH=${PATH%:}
The first and third line are there to arrange for every component of the search path to be surrounded by :
, to avoid special-casing the first and last component. The second line removes the specified component.
After considering other options presented here, and not fully understanding how some of them worked I developed my own path_remove
function, which I added to my .bashrc
:
function path_remove {
# Delete path by parts so we can never accidentally remove sub paths
PATH=${PATH//":$1:"/":"} # delete any instances in the middle
PATH=${PATH/#"$1:"/} # delete any instance at the beginning
PATH=${PATH/%":$1"/} # delete any instance in the at the end
}
This ended up pretty close to Gilles' solution but wrapped up as a bash function which could be easily used on the command line.
It has the advantages that as a bash function it works like a program without needing to be a program on the path, and it doesn't require any external programs to run, just bash string manipulation.
It appears pretty robust, in particular it doesn't turn somepath:mypath/mysubpath
into somepath/mysubpath
:if you run path_remove mypath
, which was a problem I had with my previous path_remove
function.
An excellent explanation of how bash string manipulation works can be found at the Advanced Bash-Scripting Guide.