常常需要用到远端服务器的图形工具,如果在windows端没用xserver的话,很多程序无法运行。一个特殊的例子,emacs在没用xserver的时候,是直接在终端中打开的,如果不修改cygwin.bat文件。
废话少说,下载安装cygwin的x11相关包。装完后,在C:\cygwin\usr\X11R6\bin下有个startxwin.bat文件,注释掉 %RUN% xterm -e /usr/bin/bash -l 这一行。以后每次点开此脚本文件,就不用弹出烦人的xterm了,而xserver会自动最小化在系统托盘。
但是每次都要手工点这个批处理脚本,很麻烦,于是想办法写入cygwin.bat中随着cygwin的终端一起运行。不过又有一个问题,在启动cygwin之后,如果关闭shell,那么xserver是还在运行的,下次在打开这个脚本,会弹出xserver已运行的错误。于是需要增加一个判断:如果xserver已运行,则不调用startxwin.dat脚本,否则调用。
但是问题又来了,加了此判断之后,如果xserver已启动,在关闭shell之后再重新打开shell,发现emacs又重新在shell内打开,而不是弹出窗口,bug?
于是修改对判断的处理:若xserver已运行,则杀掉该进程。这样,不管xserver在不在运行,运行cygwin.bat脚本时都会调用startxwin.dat脚本,emacs等程序也都没用问题了:)
修改之后的cygwin.bat脚本如下:
@echo off
set CYGWIN=binmode tty ntsec
C:
for /f %%i in (‘tasklist‘) do if /i %%i==XWin.exe (taskkill /IM XWin.exe /F)
call C:\cygwin\usr\X11R6\bin\startxwin.bat
chdir C:\cygwin\bin
bash --login -i
第二行是防止在shell中打开的无窗口的emacs无法退出。第四行是判断是否含有xserver的进程并处理,第五行是调用startxwin.dat脚本。
在经过这么一次折腾之后,发现就连dos的批处理都这么牛逼,可想linux的shell有多强大了,要好好学习shell编程!!!