在 Windows 中发挥 UNIX 的优势(反之亦然)
Cygwin 在 Windows 中几乎完整地模拟一个 UNIX shell。实际上,它把这两种操作系统很好地结合在一起了。例如,可以运行 df -h 命令显示 “UNIX” 机器上的空闲磁盘空间。图 7 显示结果。
图 7. 是 Windows 上的 UNIX 文件系统,还是 UNIX 上的 Windows 文件系统?
正如 前面提到的,Cygwin 安装目录作为虚拟 UNIX 系统的根目录。Cygwin 把安装目录中的子目录映射到 UNIX 目录。它以单独的卷的形式提供 Windows 驱动器,比如 /cygwin/c。可以使用这样的虚拟路径启动 Windows 程序。请尝试输入 /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE 从命令行启动 Windows Internet Explorer?。(还可以使用 Tab 键自动展开路径的元素)。
顺便说一句,如果要把 Windows 路径名转换为等效的 UNIX 路径名或者相反,可以试试内置命令 cygpath。在默认情况下,cygpath 产生 UNIX 路径名。使用 -w 选项产生 Windows 路径。
$ cygpath -w /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE
c:\Program Files\Internet Explorer\IEXPLORE.EXE
还有帮助沟通这两个环境的其他特性:
Cygwin 提供它自己的 lpr(/usr/bin/lpr 而不是 Windows 的 LPR.EXE),可以直接从模拟的 UNIX 环境进行打印。只需把 PRINTER 环境变量设置为 \\server\printer_name 或 //server/printer_name 这样的 Cygwin UNC;前向斜杠和反向斜杠都可以,在 Cygwin 中的其他地方也是如此。
在 Cygwin 中用 ln -s 创建的符号链接在 Windows 中被解释为快捷方式。同样,Windows 快捷方式在 Cygwin 中被解释为符号链接。因此,可以使用 Windows 快捷方式带参数启动 UNIX 命令。
因为 Cygwin 提供完整的 Bash shell,所以可以使用上述的所有兼容特性(和其他特性)编写 UNIX shell 脚本来维护 Windows!
例如,可以使用 UNIX find 在驱动器上搜索数据。请注意一点:在 Windows 文件名中常常使用空格。为了保持完整的文件名(请记住,UNIX 参数以空格分隔),一定要使用 find -print0 和 xargs -0。
如何更新和扩展 Cygwin
正如前面提到的,在任何时候都可以通过运行 Cygwin 安装程序添加、删除和更新 Cygwin 类别和包。我们来添加几个软件开发包,以便像在传统的 UNIX 系统上那样从源代码构建程序。
再次运行 Cygwin setup.exe 应用程序,依次通过前几个对话框,直到到达 Select Packages 窗口,见 图 4。展开 Devel 类别,使用循环控件选择以下包的最高版本:
autoconf2.1
automake1.10
binutils
gcc-core
gcc4-core
gdb
pcre
pcre-devel
做出选择之后(为了满足依赖性,可能会自动选择其他包),单击 Next 开始更新。与前面一样,下载和安装过程需要一定的时间(开发包往往相当大)。
在此期间,打开一个浏览器并通过访问 下载 GNU wget 实用程序的最新源代码。(wget 是一种命令行工具,它可以下载任何东西。关于此工具的更多信息,请参见 参考资料)。使用 Cygwin 把此文件复制到 Cygwin 中的主目录,展开压缩文件。清单 1 显示压缩文件的内容。
清单 1. wget-1.11.4.tar 的内容 $ cp /cygdrive/c/Documents\ and\ Settings/Martin/My\ Documents/wget-1.11.4.tar ~
$ tar xzvf wget-11.4.tar
wget-1.11.4/
wget-1.11.4/AUTHORS
wget-1.11.4/NEWS
wget-1.11.4/COPYING
wget-1.11.4/configure.bat
wget-1.11.4/ChangeLog
wget-1.11.4/ChangeLog.README
wget-1.11.4/msdos/
wget-1.11.4/msdos/ChangeLog
wget-1.11.4/msdos/Makefile.DJ
...
wget-1.11.4/src/cookies.c
wget-1.11.4/src/http.h
wget-1.11.4/src/log.h
wget-1.11.4/src/sysdep.h
wget-1.11.4/src/alloca.c
wget-1.11.4/src/getopt.c
wget-1.11.4/src/gnu-md5.h
wget-1.11.4/src/ftp.c
wget-1.11.4/config.sub
wget-1.11.4/config.guess
$
当 Cygwin 下载和安装过程完成时,单击 Finish。现在可以从源代码构建 wget 实用程序了。
$ cd wget-1.11.4
$ ./configure
configure: Configuring for GNU wget 1.11.4
...
creating po/Makefile
$ make
gcc -I. ...
$ make install
...
/usr/bin/install -c -m 644 ./wget.1 /usr/local/share/man/man1/wget.1
$ type wget
/usr/local/bin/wget
为了测试这个新的实用程序,在 Cygwin 中运行它并下载 wget 源代码:
稍后就会得到一个新的源代码压缩文件。使用 Cygwin 安装程序从 Cygwin 存储库获得实用程序是最简单的方法,但是也可以在 Cygwin 中构建下载的或自己的源代码。在 Cygwin 中可以使用全套 UNIX 开发工具,包括最流行的脚本编程语言。
如果您不喜欢 Microsoft Visual Studio? 等 Windows 开发工具,甚至可以用 Cygwin 中的 UNIX 编译器和工具构建原生 Windows WIN32 应用程序。(这些应用程序不在 UNIX 上运行。要想在 UNIX 上运行 Windows 应用程序,可以考虑使用 WINE。更多信息参见 参考资料)。
结束语
Cygwin 并不是完美的 UNIX 模拟环境,但已经相当好了。核心组件的文档很完善,而且特别方便,它们介绍了模拟 DLL 中的限制和安全风险。如果希望把复杂的 UNIX 包迁移到 Cygwin,请参考开发人员指南(参见 参考资料),评估 Cygwin 的支持是否能够满足您的 API 需要。
Cygwin 最棒的特性可能是它与 Windows 的集成。使用 Cygwin 和它的 UNIX 命令行来操纵系统可以大大提高生产力。建议在您的 shell PATH 变量中包含 Windows 的 Program Files 中的子目录,这样只需输入程序名,就能够启动路径中的任何二进制程序。
更棒的是,Cygwin 可以在同一个窗口中管理多个作业。按 Control-Z 可以暂停正在运行的作业;输入 bg 和 fg 分别在后台和前台运行作业;输入 jobs 管理作业列表。当然,Cygwin 还可以对输入和输出进行重定向,可以通过管道把一个命令的输出发送给另一个命令。
Cygwin 真的很不错。