【发布时间】:2013-03-22 03:23:08
【问题描述】:
我有一堆用来在 Linux 机器上运行的 shell 脚本。现在,我们已经切换到 Windows,我需要在那里运行这些脚本。我安装了Cygwin,但是有没有办法让脚本使用 Cygwin 运行,但是 调用是从 Windows 批处理?
【问题讨论】:
标签: batch-file cygwin
我有一堆用来在 Linux 机器上运行的 shell 脚本。现在,我们已经切换到 Windows,我需要在那里运行这些脚本。我安装了Cygwin,但是有没有办法让脚本使用 Cygwin 运行,但是 调用是从 Windows 批处理?
【问题讨论】:
标签: batch-file cygwin
当然。在我的(相当普通的)Cygwin 设置中,bash 位于 c:\cygwin\bin 中,因此我可以使用以下命令从 Windows 批处理文件中运行 bash 脚本(比如 testit.sh):
C:\cygwin\bin\bash testit.sh
... 可以像在命令行中键入一样容易地包含在.bat 文件中,并且具有相同的效果。
【讨论】:
echo -n hello 放在脚本testit.sh 中,当由Cygwin 运行时,输出将为hello,当由Windows 命令解释器运行时,输出将为-n hello。我希望更可能的解释是bash 中的路径设置不正确,所以我会检查bash 是否正确读取.profile 或.bash_profile
find.exe 而不是 bash 版本 - 例如,请参阅 Find: Parameter format not correct。
还有一件事——如果你在一些 Windows 文本编辑器中编辑了 shell 脚本,它产生了 \r\n 行尾,cygwin 的 bash 不会接受那些 \r。在执行脚本之前运行dos2unix testit.sh:
C:\cygwin\bin\dos2unix testit.sh
C:\cygwin\bin\bash testit.sh
【讨论】:
如果您可以访问 Windows 上的 Notepad++ 编辑器,则有一项功能可以让您轻松解决此问题:
我这样做了,它解决了我的问题。
希望这会有所帮助!
阅读更多http://danieladeniji.wordpress.com/2013/03/07/microsoft-windows-cygwin-error-r-command-not-found/
【讨论】:
只是想补充一点,您可以这样做以对目录下的所有文件应用 dos2unix 修复,因为当我们不得不“修复”一堆脚本时,它为我节省了大量时间。
find . -type f -exec dos2unix.exe {} \;
我想作为对 Roman 的回答的评论,但我还没有评论的权限。
【讨论】:
现有答案似乎都在 DOS 控制台窗口中运行此脚本。
这可能是可以接受的,但例如意味着颜色代码(更改文本颜色)不起作用,而是按原样打印出来:
没有项目“[032mGroovy[0m””
我前段时间找到了这个解决方案,所以我不确定mintty.exe 是否是标准的Cygwin 实用程序,或者您是否必须运行setup 程序才能获得它,但我是这样运行的:
D:\apps\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico bash.exe .\myShellScript.sh
...这会导致脚本在 Cygwin BASH 控制台而不是 Windows DOS 控制台中运行。
【讨论】:
如果您不介意在脚本文件名中始终包含 .sh,那么您可以为 Cygwin 和 Unix (Macbook) 保留相同的脚本。
举例说明:
1. 始终在脚本文件名中包含 .sh,例如 test1.sh
2. test1.sh 示例如下:
3. 在装有 Cygwin 的 Windows 上,键入“test1.sh”运行#!/bin/bash
echo '$0 = ' $0
echo '$1 = ' $1
filepath=$1
4. 在 Unix 上,你也可以输入“test1.sh”来运行
注意:在 Windows 上,您需要使用文件资源管理器执行以下操作:
1.打开文件资源管理器
2. 右键单击扩展名为 .sh 的文件,例如 test1.sh
3. 打开... -> 选择 sh.exe
在此之后,您的 Windows 10 会记住使用 sh.exe 执行所有 .sh 文件。
注意:使用此方法,您无需在脚本文件名前加上 bash 即可运行
【讨论】: