Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to execute a bat file from cygwin bash that uses the Windows find command

The find command does completely different in Windows and Unix. On Windows it is a fgrep-like utility listing matching lines in a file; on Unix -- and on Cygwin -- it list filenames matching some criteria.

Cygwin bash prepends its standard directories to the current path, so inside bash $PATH is typically /bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS.

Begin Update to provide additional details

For example I have many scripts that use the gnu find command -- for example scripts to purge directory trees that contain no files:

purge-empty-dirs.sh find . -depth -type d -empty | xargs rmdir -p 

I also have a bat file to start my build, which uses the windows find command, which searches for lines matching a string (similar to gnu grep).

build.bat ... dir | find "target" if errorlevel = 1 goto no_target_dir ... 

Now, for my bash script to work I need /bin to be in path before c:\windows\system32. But for my bat file to run I need c:\windows\system32 to be in path before /bin

In general we might be able to claim that all bat files should be executed with the original environment inherited by bash, not the modified one. Does that make sense?

End Update

This how it should be, but breaks the bat files executed from bash. What is the best way to address this?

Is there a way to force Cygwin to execute bat files (or even all Windows executables) with the environment it started with? I am thinking of start /i behavior of cmd.exe. I am thinking of writing my own cygstart like utility that does this, by saving the environment (or at least $PATH) in .bash_profile/.bashrc. Does that make sense?

Any other suggestions?

Edit: See also Start new cmd.exe and NOT inherit environment

like image 351
Miserable Variable Avatar asked Jul 10 '13 23:07

Miserable Variable


People also ask

How do I run a BAT file from a shell script?

Batch files can be run by typing "start FILENAME. bat". Alternately, type "wine cmd" to run the Windows-Console in the Linux terminal. When in the native Linux shell, the batch files can be executed by typing "wine cmd.exe /c FILENAME.


1 Answers

If you chmod +x your.bat it works.

./your.bat 

is run via cmd /c

Already answered in Why is it that Cygwin can run .bat scripts?

like image 139
rurban Avatar answered Oct 07 '22 16:10

rurban