find
命令在Windows和Unix中完全不同。在Windows上,它是一个fgrep
- 类似的实用程序,列出了文件中的匹配行;在Unix上 - 和Cygwin上 - 它列出了符合某些标准的文件名。
Cygwin bash 将其标准目录预先到当前路径,因此内部bash $PATH
通常为/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS
。
开始更新以提供其他详细信息
例如,我有许多使用gnu find
命令的脚本 - 例如脚本清除不包含文件的目录树:
purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p
我还有一个bat文件来启动我的构建,它使用windows find命令,它搜索匹配字符串的行(类似于gnu grep
)。
build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...
现在,为了让我的bash脚本正常工作,我需要/bin
在c:\windows\system32
之前的路径中。但是要运行我的bat文件,我需要c:\windows\system32
在/bin
一般情况下,我们可能会声称所有bat文件都应该使用bash继承的原始环境执行,而不是修改后的。这有意义吗?
结束更新
这应该如何,但打破从bash执行的bat文件。解决这个问题的最佳方法是什么?
有没有办法强制Cygwin使用它开始的环境执行bat文件(甚至所有 Windows可执行文件)?我在考虑cmd.exe的start /i
行为。我正在考虑通过在cygstart
/ $PATH
中保存环境(或至少.bash_profile
)来编写我自己的.bashrc
类似实用程序。那有意义吗?
还有其他建议吗?
答案 0 :(得分:30)
答案 1 :(得分:5)
我已经测试了来自here的解决方案并且效果很好:
start "clean shell" /i "%windir%\explorer.exe" "\path\to\your\script.bat"
to-run.bat
脚本:
echo %PATH%
echo "TODO: some commands"
cmd
cygwin
bash脚本,run-me.sh
:
#!/bin/bash -e
set -x
SCRIPT_WINPATH=`cygpath --windows --absolute "$1"`
EXPLORER_CYGPATH=`which explorer`
EXPLORER_WINPATH=`cygpath --windows --absolute "${EXPLORER_CYGPATH}"`
cmd /C start "clean shell" /I "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"
试验:
chmod +x to-run.bat
chmod +x run-me.sh
./run-me.sh to-run.bat
答案 2 :(得分:2)
您可以使用包装,例如launcher.bat
,其内容为
@echo off
setlocal
rem modify here based on your needs
set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
call %*
endlocal
exit %errorlevel%
假设您要使用来自cygwin bash脚本的cmdFUBAR.bat
wellDoneMS
来调用cmdFUBAR.bat wellDoneMS
,而不仅仅是cygstart -w launcher.bat cmdFUBAR.bar wellDoneMS
,而是launcher.bat
。当然,您必须将{{1}}放入您的路径中,或以完整路径调用它。
答案 3 :(得分:0)
===在build.bat脚本中......
SET DOS_FIND_EXE=%SYSTEMROOT%\system32\find.exe
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel = 1 goto no_target_dir
...
答案 4 :(得分:0)
@ruslo给出的答案非常有用并且运行得很好,但是它有一个冗余:start "clean shell" /I
在这里什么都不做:-)这是explorer
件摆脱了目前的cygwin env,而不是start /i
!尝试从脚本的最后一行省略它,如下所示:
cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"
同样的结果 - “原始路径”!
仔细阅读start
的帮助,它说:新环境将是传递给cmd.exe而不是当前环境的原始环境。嗯,但环境传递给在这种情况下,cmd
是cygwin
的{{1}},因此start /i
在这里没有任何用处,可以通过输入来看到:
cmd /c start /i cmd /c "path && pause"
路径仍然是cygwin
的路径,而不是Windows系统!