How to escape colon (:) in $PATH on UNIX?
environment-variables, escaping, linux, path, special-characters
Solution
This is impossible according to the POSIX standard. This is not a function of a specific shell, PATH handling is done within the execvp function in the C library. There is no provision for any kind of quoting.
This is the reason why including certain characters (anything not in the "portable filename character set" - colon is specifically called out as an example.) is strongly recommended against.
From SUSv7:
Since `<colon>` is a separator in this context, directory names that might be used in PATH should not include a `<colon>` character.
See also source of GLIBC execvp. We can see it uses the `strchrnul` and `memcpy` functions for processing the PATH components, with absolutely no provision for skipping over or unescaping any kind of escape character.
Problem
I need to parse the `$PATH` environment variable in my application. So I was wondering what escape characters would be valid in `$PATH`. I created a test directory called `/bin:d` and created a test script called `funny` inside it. It runs if I call it with an absolute path. I just can't figure out how to escape `:` in `$PATH` I tried escaping the colon with `\` and wrapping it into single `'` and double `"` quotes. But always when I run `which funny` it can't find it. I'm running CentOS 6.