Remove bash invocation on Windows in rebar_utils:sh/2

Jan Klötzke jan.kloetzke at
Fri Sep 30 10:18:53 EDT 2011


The following applies to rebar on Windows only!

I've recently submitted a pull request to remove the bash invocation on 
Windows in rebar_utils:sh/2 (see 
It's not intended for immediate merging but rather than to be *tested* by some 
folks who use rebar on Windows, preferably with one of the less commonly used 

So, if you are using rebar on Windows then I would appreciate any feedback.

== Rationale ==

Currently rebar_utils:sh/2 will invoke all commands through bash.exe if found. 
Otherwise the command will be executed directly. Despite the fact that the 
caller cannot know if the command is executed with Unix or Windows semantics 
it leads to the following problem:

The rebar_file_utils module (namely rm_rf/1, cp_r/2 and mv/2) is not working 
as expected on Windows when MSYS is installed. These functions call cmd.exe 
with some options (e.g. /c) and native path names. There are two problems with 
this: first any backslashes would have to be escaped (easy to fix) and options 
like '/c' are expanded to 'C:\' by the MSYS automatic path name translation.

You can observe this automatic path name translation by trying the following: 
open a MSYS bash and type:

 $ cmd /c /q @echo foo

Instead of just seeing 'foo' being printed you end up on the cmd.exe prompt. 
Now type

 > echo %CMDCMDLINE%

to see what actually got executed (e.g. "c:\WINDOWS\system32\cmd.exe C:/ 
C:/Programme/Git/q echo foo" in my case).

Probably, though I haven't checked, the following problems are also affected 
by using bash on Windows:

== Conclusion ==

Don't use bash on Windows to get a consistent behavior and to avoid the 
peculiarities of MSYS's automatic path conversion.

== Impact ==

Basically all rebar_utils:sh/2 calls are affected on Windows.

I did test the following rebar commands and they are working as expected 

 * clean
 * compile (*.erl, *.app.src, *.c)
 * create
 * *-deps
 * generate

and additionally the rebar_file_utils eunit test suite.

What _may_ not work anymore are the following modules, even if MSYS is 
installed, because they use e.g. 'grep' and output redirection:

 * rebar_neotoma_compiler
 * rebar_erlydtl_compiler
 * rebar_ct

If anybody uses these features on Windows then I'd love to get some testing 


More information about the rebar mailing list