cygwin detection

Fri Sep 29 15:25:00 GMT 2006

Kenneth Nellis wrote:
> Couldn't find anything relevant in the archives or the documentation...
> I have bash scripts that I want to run identically under Cygwin and 
> Linux, which sometimes require the scripts to detect the environment 
> and branch accordingly. There are numerous ways to do Cygwin detection, 
> but I was wondering what technique should work with the widest audience 
> and be most immune to future Cygwin developments.
> FWIW, below are various techniques that work for *me* *today*, some of 
> which have obvious flaws.
> if [ -f /usr/bin/cygwin1.dll ]; then
> if [ $CYGWIN_ROOT ]; then
> if [ $OSTYPE = cygwin ]; then
> if [ $(uname -s | grep -c CYGWIN) -gt 0 ]; then
> if [ $(grep -c cygwin <<< ${BASH_VERSINFO[5]}) -gt 0 ]; then
> if is_cygwin; then    # where is_cygwin is a locally-built C program
>                       # that tests #ifdef __CYGWIN__

Well, FWIW I've always used a combination of '#ifdef __CYGWIN__' and 
uname (basically, the former when compiling C and the latter in 
scripts)... of course, both of those are only really testing if gcc and 
uname (respectively) are pointing at Cygwin versions. I would say that 
99% of the time though 'uname' will work; basically it will only fail if 
you have an Interix/MKS/MinGW 'uname' in PATH, but you can always check 
for those as well to distinguish "real UNIX" from "UNIX on Windows". If 
anyone builds a 'uname' on a Windows system that tells you 'Linux', they 
deserve what they get. :-) I'd be inclined to say that anyone with a 
system where 'uname' is wrong deserves to have things break.

If you *know* you are running bash, you can also check if it is MinGW by 
testing if $BASH starts with '/' (at least, I assume it would be a DOS 
path on MinGW, and MKS doesn't have bash). But this won't distinguish 
Cygwin from Interix.

My preferred shell is Christian. It's Bourne Again.

Unsubscribe info:
Problem reports:

More information about the Cygwin mailing list