S-JIS[2008-10-17/2016-04-27] 変更履歴

Cygwin

Cygwin(シグウィン)は、Windows上でUNIXの環境を提供するソフト。
Windows(のコマンドプロンプト)上からUNIXのコマンドを実行することが出来る。


概要

CygwinではWindowsで使える(UNIX関数の)ヘッダーファイルやライブラリーファイル類が提供されており、
UNIXの関数を使ったコーディングをしてコンパイルすることにより、Windows用の実行ファイル(exe)が作れる。
また、そうして作られたコマンド(実行ファイル)を実行する為のDLL(代表がcygwin1.dll)が提供されている。

これらの機能を用いてUNIXの各ソフトのコンパイルを行ってWindowsの実行ファイルが作られていて、それがCygwinの一部として提供されているので、CygwinをインストールするとUNIXのコマンドが使えるようになる。


インストール

  1. Cygwinのサイトからsetup-x86_64.exeをダウンロードする。[/2016-04-27]
  2. ダウンロードしてきたsetup-x86_64.exeを実行すると、「Cygwin Setup」が起動する。
    (これは、インターネットからCygwinの実体を選択・ダウンロード・インストールするもの)
  3. Root Directory」にはCygwinをインストールするディレクトリーを指定する。デフォルトは「C:\cygwin」。
  4. 「Local Package Directory」には、ダウンロードするアーカイブを格納するディレクトリーを指定する。
  5. ミラーサイトが色々あるので、適当に選ぶ。
    まずアーカイブの一覧がダウンロードされるので、ちょっと待つ。
  6. Select Packages」で、ダウンロード(インストール)するソフト(パッケージ)を選択する。初めての場合はデフォルトのままでいいと思う。
  7. 「次へ」ボタンでダウンロード・インストールされる。
    デフォルトでもけっこうな数のソフトがインストールされるので、1〜2時間はかかる。

追加インストール

後から追加インストール(やソフト毎のアンインストール)をすることも出来る。
再びsetup-x86_64.exeを実行すればいいだけ。

以下のようなソフトはデフォルトでは入っていない。

ソフト Select Packages コマンド名 実体 備考 更新日
cron Admin cron        
Cコンパイラー Devel gcc-core cc
gcc
gcc.exe Linux向けgcc  
C++ Devel gcc-g++     Linux向けg++  
make Devel make make make.exe   2011-08-08
vi Editor vim vi
view
vim.exe    
OpenSSH Net openssh ssh ssh.exe インストール後の設定 2010-02-18
ksh Shells pdksh ksh pdksh.exe    
tcsh Shells tcsh csh
tcsh
tcsh.exe    
logger System
Text
Utils
util-linux logger logger.exe デフォルトでは、Windowsのイベントログに出力される。 2008-11-23

※複数のカテゴリーにある場合は、どのカテゴリーから選んでもいいと思われる。

欲しいコマンドがどのパッケージに入っているのかは、cygcheck -pを使って探すことが出来る。[2008-11-23]
一旦インストールしたソフトがどのパッケージに入っていたものなのかは、cygcheck -fを使って確認できる。

参考


アンインストール

Cygwin全体をアンインストールするには、直接ディレクトリーを削除したりレジストリーを消したりする必要があるらしい。


Cygwin(bash)の起動

インストールの最後に“デスクトップへのショートカットの作成”を行っていれば デスクトップに「Cygwin」というショートカットが出来ているので、それを実行すればよい。
もしくは、Windowsのスタート→「プログラム(P)」→「Cygwin」→「Cygwin Bash Shell」。
これでbashが起動するので、その中で(インストールされている)UNIXコマンドが実行できる。
(初回だけ、ユーザー用の初期設定を行うためか、bashが起動するのにちょっとだけ時間がかかる)

このショートカットは「C:\cygwin\Cygwin.bat」というバッチファイルを指しており、この中はただ単に「C:\cygwin\bin\bash.exe」を実行しているだけ。
このbash上のコマンドの入出力にはWindowsのコマンドプロンプトが使われている模様。 (したがって、コマンドプロンプトのコピー&ペースト機能が使える)


Cygwin(bash)の初期設定

Cygwinのbashでlsを使うと、日本語ファイル名が文字化けする。
.bashrcに以下のaliasを加えておくと文字化けしなくなる。

alias ls='ls --show-control-chars'

Cygwin独自のコマンド

cygcheck --version

Cygwin(cygwin1.dll)のバージョンを表示する。

cygcheck -s

Cygwinのシステム情報を表示する。[2008-11-23]
インストールされているパッケージのバージョンも表示される(が、それは-cの方が便利かも)。

$ cygcheck -s | grep util-linux
util-linux              2.13.1-2

-rオプションも併用すると、Cygwinに関係するWindowsのレジストリーの内容も表示される。

cygcheck -c

インストールされている各パッケージのバージョンと状態を表示する。[2008-11-23]
-dオプションを併用すると、状態(正しくインストールされているかどうか)の表示は行わない。

cygcheck -f コマンドのフルパス

コマンドがどのパッケージに入っていたものなのかを表示する。[2008-11-23]

$ cygcheck -f /usr/bin/logger
util-linux-2.13.1-2

cygcheck -l パッケージ名

インストールされているパッケージに含まれている内容(コマンド等)一覧を表示する。[2008-11-23]

cygcheck -p コマンドのファイル名やキーワード

コマンドがどのパッケージに入っているかを表示する。[2008-11-23]
(コマンドをインストールしていなくても使える。というかインストールする際にどこから取ってくればいいかを調べる為のもの?)
インターネット(cygwin.comのパッケージリポジトリー)に接続して探すので、結果が出るまで多少時間がかかる。

$ cygcheck -p logger.exe
Found 3 matches for logger.exe.
inetutils/inetutils-1.3.2-37 Common networking clients and servers
util-linux/util-linux-2.13.1-1 Random collection of Linux utilities
util-linux/util-linux-2.13.1-2 Random collection of Linux utilities

-pの指定は正規表現らしいので、拡張子を付けるなら正確には"logger\.exe"とすべきか。
また、例えばvim.exeを検索するとgvim.exeも引っ掛かってくる。

なら、以下のようにする方がもっと確実?(大抵のコマンドは/binの下に入っているので)

$ cygcheck -p /bin/logger
Found 3 matches for /bin/logger.
inetutils/inetutils-1.3.2-37 Common networking clients and servers
util-linux/util-linux-2.13.1-1 Random collection of Linux utilities
util-linux/util-linux-2.13.1-2 Random collection of Linux utilities

例えばwhoコマンドの様に、whoisといった他のコマンドの接頭辞になってしまうものもある。だからまずは/bin/who.exeで調べるのがいいかも。
でもviコマンドだとvi.exeとしては存在しないので(vim.exeへのシンボリックリンクだから)、/bin/vi.exeでは見つからない。その場合は次に/bin/viで探して勘と経験で絞り込む。
でもkshコマンドだとそれでも見つからない。ksh.exeでpdkshが見つかる(/bin/pdksh.exeだから)。
最悪はkshとかで探すしかない。探したいものが一般的な単語だといっぱい出てきちゃうが。
要するに色々試すしかないということか(嘆) インストールするとリンクを作成してくれるなら、そのリンク名で検索できると便利なのだが。

コマンド名の他にもコメント(例えばbashなら"Bourne Again SHell")でも検索できるが…そんなキーワードがぴったり分かってるほうが稀か(苦笑)

-pではそのパッケージのカテゴリーまでは知る事が出来ない。
しかしインストール時にViewボタンで「Full」とか(「Category」以外)にすればパッケージ順になるので、それで選ぶことが出来る。
また、その際にカテゴリーも表示されるので、そこで知る事が出来る。

cygpath 〔オプション〕 パス

Cygwin用(UNIX)のパスとWindows用のパスの変換を行う。(基本的に、パスが実在しなくても変換可)

オプション 変換結果
-w
--windows
-t windows
--type windows
cygpath -w /home/hishidama/zzz.txt C:\cygwin\home\hishidama\zzz.txt
-m
--mixed
-t mixed
--type mixed
cygpath -m /home/hishidama/zzz.txt C:/cygwin/home/hishidama/zzz.txt
-d
--dos
-t dos
--type dos
cygpath -d "/cygdrive/c/Program Files/" c:\PROGRA~1\
cygpath -d "/cygdrive/c/Program Files2/"
(存在しないパスはエラーになる)
cygpath: cannot create short name of c:\Program Files2\
-u
--unix
-t unix
--type unix
cygpath C:\\cygwin\\home\\hishidama\\zzz.txt
cygpath "C:\cygwin\home\hishidama\zzz.txt"
cygpath "C:\foo.txt"
/home/hishidama/zzz.txt
/home/hishidama/zzz.txt
/cygdrive/c/foo.txt
-a
--absolute
cygpath -a zzz.txt
cygpath -aw zzz.txt
/home/hishidama/zzz.txt
C:\cygwin\home\hishidama\zzz.txt
-p
--path
cygpath -up "$CLASSPATH"
.;C:\〜\lib\tools.jar;C:\〜\hoge.jar
.:/cygdrive/c/〜/lib/tools.jar:/cygdrive/c/〜/hoge.jar
cygpath -mp /home/java/foo.jar:/home/java/bar.jar C:/cygwin/home/java/foo.jar;C:/cygwin/home/java/bar.jar

-dによる8.3形式の短縮名への変換は、実際に存在しているパス(ファイル)でないとエラーになる。[2008-12-26]
その他の変換では、存在していないパス(ファイル)でも問題ない。

-aを付けるとフルパス(絶対パス)で表示される。[2013-09-11]


Cygwinかどうかを判定する方法

シェルの中でCygwinかどうか判定するのは、Hadoopでは以下の様な感じで行っている。[2011-10-01]

cygwin=false
case "$(uname)" in
CYGWIN*) cygwin=true;;
esac
if $cygwin; then
  echo Cygwin!
fi
if ! $cygwin; then
  echo not Cygwin
fi

Cygwinを使ってコンパイル・実行

Cygwinを使ってC言語のソースをコンパイルして実行ファイル(exe)を作ることが出来る。

まず、vi(要インストール)か何かのエディターでソースを書く。(別にWindows上のエディターで書いてもいいんだけど)

$ cd
$ vi sample.c

/home/hishidama/sample.cC:\cygwin\home\hishidama\sample.c):

#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("cygwin!\n");

	return 123;
}

そして、gcc(要インストール)でコンパイルする。

$ gcc sample.c -o sample.exe
$ ls
sample.c  sample.exe

コンパイルが通れば、実行することが出来る。

$ ./sample.exe
cygwin!

$ echo $?
123

コンパイルして出来た実行ファイルはあくまでもWindowsの実行ファイル(exe)なので、Windows(コマンドプロンプト)から実行することが出来る。

コマンドプロンプト:

C:\cygwin\home\hishidama> sample.exe

が、そのままでは「コンポーネントが見つかりません」というダイアログが出てエラーになる。
実行するには「cygwin1.dll」がPATHに入っている必要がある。

C:\cygwin\home\hishidama> PATH=%PATH%;C:\cygwin\bin
C:\cygwin\home\hishidama> sample.exe
cygwin!

C:\cygwin\home\hishidama> echo %ERRORLEVEL%
123

Cygwin外プログラムの実行

Cygwin(bash)から実行する各コマンド(実行ファイル)も、その実体はWindows用の実行ファイル(exe)になる。
逆に言えば、Cygwin(bash)から“通常のWindows用exeファイル”(コンソールアプリ等)を実行することが出来る。

このとき、そのコマンドの引数に絶対パス(ファイル名やディレクトリー名のフルパス)を渡す必要があるのであれば、注意が要る。
Cygwin用の実行ファイルはCygwin用のパスを解釈してくれるが、通常のコマンドは当然のことながら引数やWindows上のパスとして解釈して動作する為。

例えばWindowsのtree(tree.com)をCygwin(bash)から使うことが出来る。

$ cd /home/hishidama
$ tree.com		←拡張子まで付けないと、tree.exeを探しに行くので見つからなくてエラーになる
フォルダ パスの一覧
ボリューム シリアル番号は BYYY-9ZZZ です
C:.
├─c
└─java

しかし、絶対パスを指定すると、引数として解釈されてしまう(DOSコマンドでは、引数はスラッシュで始めるのが一般的)。

$ tree.com /home/hishidama
無効なスイッチです - /home/hishidama

javac(javac.exe)のようにスラッシュを引数と解釈しないコマンドでも、絶対パスとしては認識してくれない。

$ javac /home/hishidama/java/Sample.java
javac: ファイルが見つかりません: \home\hishidama\java\Sample.java

こういう場合に、cygpathがとても便利!

$ tree.com `cygpath -w /home/hishidama`
フォルダ パスの一覧
ボリューム シリアル番号は BYYY-9ZZZ です
C:\CYGWIN\HOME\HISHIDAMA
├─c
└─java
$ javac `cygpath -w /home/hishidama/java/Sample.java`
$ ls
Sample.class


javaコマンドにクラスパスを指定して実行するようなシェルも作れる。

/home/hishidama/run.sh

#!/bin/bash
JAR=/home/hishidama/java
CLS=jp.hishidama.sample.Sample

# jarファイルを列挙してクラスパスを作る
CP=
for f in `ls $JAR/*.jar`
do
  CP=$CP:$f		←ここではUNIXのパスなのでコロンで区切る
done

# Windowsのパス形式に変換
CP=`cygpath -mp $CP`	←これにより、各パスがWindows形式になると共に、セミコロン区切りに変わる

java -cp "$CP" $CLS	←セミコロンはUNIXではコマンドの区切りなので、ダブルクォーテーションでくくる必要がある

ちなみに、ociドライバーを使用するJavaプログラムを実行する場合、環境変数ORACLE_HOMEをセットするのであれば、Windowsとしてのパスで正しいものを指定しておく必要がある。[2008-10-25]


外部から(Cygwinで)シェルを実行

Cygwin(bash)でないところ(コマンドプロンプト等)から、bashを経由してシェルを実行することも出来る。

コマンドプロンプト:

> PATH=%PATH%;C:\cygwin\bin
> bash --login /home/hishidama/run.sh

環境変数PATHにbash.exeの場所を指定してやらないと、当然実行できない。
実行したいシェルはUNIXのパスとしてのフルパスで指定する必要がある。

「--login」を付けているのは、bash内の環境(特にPATH)を初期化した方が便利だから。
こうしないと、PATHも(UNIX用には)初期化されないので、lsやcygpathといったCygwinのコマンドが実行できない。

ついでに「-x」(「--login -x」の順)を付けてやると、環境が初期化される様子も表示される。

AntからCygwinのコマンドを実行する例


JavaのProcessBuilderからも(bash.exeを経由して)シェルを実行することが出来る。

Bash.java:

package jp.hishidama.sample;

import java.io.*;
import java.util.*;

public class Bash {

	public static final String CYGWIN_HOME = "C:/cygwin";

	public static void main(String[] args) throws Exception {

		List<String> list = new ArrayList<String>();
		list.add("/home/hishidama/run.sh");

		execute(list);
	}

	public static int execute(List<String> list) throws Exception {

		String os = System.getProperty("os.name");
		if (os != null && os.startsWith("Windows")) {
			list.add(0, CYGWIN_HOME + "/bin/bash.exe");
			list.add(1, "--login");
			// list.add(2, "-x");
		}

		ProcessBuilder pb = new ProcessBuilder(list);
		pb.redirectErrorStream(true);

		Process p = pb.start();
		〜
		return p.exitValue();
	}
}

ProcessBuilder側を変えずにシェルを呼び出す方法 [2011-07-28]


技術メモへ戻る
メールの送信先:ひしだま