在Windows上通过Cygwin运行Shell脚本

70

我有一堆原本在Linux机器上运行的shell脚本,现在我们已经切换到Windows,我需要在那里运行这些脚本。我已经安装了Cygwin,但是有没有办法让脚本使用Cygwin运行,但是从Windows批处理中进行调用?

6个回答

94
当然。在我的(相当普通的)Cygwin设置中,bashc:\cygwin\bin 中,因此我可以使用类似以下命令的Windows批处理文件来运行bash脚本(例如testit.sh):
C:\cygwin\bin\bash testit.sh

...可以和在命令行中输入一样容易地包含在.bat文件中,并具有相同的效果。


7
提醒一下:将路径设置为C:\cygwin64\bin;%PATH%,然后运行C:\cygwin64\bin\bash testit.sh。请注意不要改变原意,尽量让翻译通俗易懂。 - user861746
1
当我尝试这样做时,从shell脚本命令中出现错误,"mkdir: command not found"。看起来像是Windows在执行shell脚本,而不是cygwin? - swv
1
@swv:这很容易测试。例如,如果您在脚本“testit.sh”中放置echo -n hello,当Cygwin运行时,输出将为hello,而当Windows命令解释器运行时,输出将为-n hello。我认为更可能的解释是路径在bash中没有被正确设置,因此我会检查bash是否正确读取.profile.bash_profile - Simon
嘿,我遇到了“FIND:参数格式不正确”的问题...它无法识别bash命令?尽管我可以在cygwin中运行它... - ScipioAfricanus
@user861746,我认为你的评论解决了我在超级用户上的旧问题:https://superuser.com/questions/1602846/how-to-get-correct-environment-when-launching-cygwin-script - Bowi
显示剩余2条评论

47

还有一件事 - 如果您使用某个Windows文本编辑器编辑了shell脚本,该编辑器会生成\r\n行结尾符,则cygwin的bash将无法接受那些\r。在执行脚本之前,请先运行dos2unix testit.sh

C:\cygwin\bin\dos2unix testit.sh
C:\cygwin\bin\bash testit.sh

33

3
对于 Sublime Text 用户,操作为 View->Line Endings->Unix。 - Shail

10

想补充一下,你可以用这种方法在一个目录下为所有文件应用 dos2unix 修复程序,当我们需要“修复”一堆脚本时,这个方法省了我很多时间。

find . -type f -exec dos2unix.exe {} \;

我会把它作为对Roman回答的评论,但我还没有评论的权限。


4
所有现有的答案似乎都在DOS控制台窗口中运行此脚本。
这可能是可接受的,但例如意味着颜色代码(更改文本颜色)不起作用,而是按原样打印出来:
“there is no item” [032mGroovy[0m”
我一段时间前发现了这个解决方案,所以我不确定 mintty.exe 是否是标准的Cygwin工具,或者是否必须运行 setup 程序才能获得它,但我以这种方式运行:
D:\apps\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico  bash.exe .\myShellScript.sh

...这将导致脚本在Cygwin BASH控制台中运行,而不是Windows DOS控制台。


3
如果您不介意在脚本文件名中始终包含“.sh”,那么您可以保持相同的脚本用于Cygwin和Unix(Macbook)。
举个例子: 1. 在脚本文件名中始终包含.sh,例如test1.sh。 2. 作为示例,test1.sh如下所示:
#!/bin/bash echo '$0 = ' $0 echo '$1 = ' $1 filepath=$1
3. 在Cygwin上的Windows中,键入“test1.sh”以运行。 4. 在Unix上,您也可以键入“test1.sh”以运行。
注意:在Windows上,您需要使用文件资源管理器执行以下操作: 1. 打开文件资源管理器。 2. 右键单击一个带有.sh扩展名的文件,例如test1.sh。 3. 打开方式... -> 选择sh.exe。 之后,您的Windows 10将记住使用sh.exe执行所有.sh文件。
注意:使用此方法,您无需在运行时在脚本文件名前添加bash。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接