Cygwinは、Windows上でUNIXの環境を提供するソフト。
Windows(のコマンドプロンプト)上からUNIXのコマンドを実行することが出来る。
|
|
CygwinではWindowsで使える(UNIX関数の)ヘッダーファイルやライブラリーファイル類が提供されており、
UNIXの関数を使ったコーディングをしてコンパイルすることにより、Windows用の実行ファイル(exe)が作れる。
また、そうして作られたコマンド(実行ファイル)を実行する為のDLL(代表がcygwin1.dll)が提供されている。
これらの機能を用いてUNIXの各ソフトのコンパイルを行ってWindowsの実行ファイルが作られていて、それがCygwinの一部として提供されているので、CygwinをインストールするとUNIXのコマンドが使えるようになる。
後から追加インストール(やソフト毎のアンインストール)をすることも出来る。
再び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を使って確認できる。
Windows10が壊れたのでOS再インストールをした。[2016-11-26]
CygwinをインストールしていたDドライブは無事だったので、Cygwinのディレクトリーはそのまま使える…と思ったら、Cygwinのインストール(アップデート)はする必要があった(でないとbashを起動できない)。
で、ファイルは残っていて読むことは出来たのだが、ファイルやディレクトリーのオーナーが変になっていて書き込みが出来ない。
$ ls -la 合計 37 drwxr-xr-x+ 1 Unknown+User Unknown+Group 0 11月 26 11:27 . drwxrwxrwt+ 1 Unknown+User Unknown+Group 0 4月 27 2016 .. -rw------- 1 Unknown+User Unknown+Group 10967 11月 26 11:26 .bash_history -rwxr-xr-x 1 Unknown+User Unknown+Group 1513 11月 26 11:27 .bash_profile -rwxr-xr-x 1 Unknown+User Unknown+Group 6054 8月 29 2015 .bashrc -rwxr-xr-x 1 Unknown+User Unknown+Group 1919 8月 29 2015 .inputrc -rwxr-xr-x 1 Unknown+User Unknown+Group 1236 8月 29 2015 .profile
Windowsのアカウント名は同じにしてあったのだが、IDが変わってしまったのだと思われる。
この状態からただ単にchownしてもpermission
deniedになってしまうorz
bash(Cygwin)を「管理者として実行」すればchownすることが出来る。
idコマンドで自分のアカウント名を確認して、その名前に変えればよい。
$ chown -R hishidama:None .* $ chown -R hishidama:None *
Cygwin全体をアンインストールするには、直接ディレクトリーを削除したりレジストリーを消したりする必要があるらしい。
インストールの最後に“デスクトップへのショートカットの作成”を行っていれば デスクトップに「Cygwin」というショートカットが出来ているので、それを実行すればよい。
もしくは、Windowsのスタート→「プログラム(P)」→「Cygwin」→「Cygwin Bash Shell」。
これでbashが起動するので、その中で(インストールされている)UNIXコマンドが実行できる。
(初回だけ、ユーザー用の初期設定を行うためか、bashが起動するのにちょっとだけ時間がかかる)
このショートカットは「C:\cygwin\Cygwin.bat」というバッチファイルを指しており、この中はただ単に「C:\cygwin\bin\bash.exe」を実行しているだけ。
このbash上のコマンドの入出力にはWindowsのコマンドプロンプトが使われている模様。
(したがって、コマンドプロンプトのコピー&ペースト機能が使える)
Cygwinのbashでlsを使うと、日本語ファイル名が文字化けする。
.bashrcに以下のaliasを加えておくと文字化けしなくなる。
alias ls='ls --show-control-chars'
Cygwin(cygwin1.dll)のバージョンを表示する。
Cygwinのシステム情報を表示する。[2008-11-23]
インストールされているパッケージのバージョンも表示される(が、それは-cの方が便利かも)。
$ cygcheck -s | grep util-linux util-linux 2.13.1-2
-rオプションも併用すると、Cygwinに関係するWindowsのレジストリーの内容も表示される。
インストールされている各パッケージのバージョンと状態を表示する。[2008-11-23]
-dオプションを併用すると、状態(正しくインストールされているかどうか)の表示は行わない。
コマンドがどのパッケージに入っていたものなのかを表示する。[2008-11-23]
$ cygcheck -f /usr/bin/logger util-linux-2.13.1-2
インストールされているパッケージに含まれている内容(コマンド等)一覧を表示する。[2008-11-23]
コマンドがどのパッケージに入っているかを表示する。[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」以外)にすればパッケージ順になるので、それで選ぶことが出来る。
また、その際にカテゴリーも表示されるので、そこで知る事が出来る。
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 |
/home/hishidama/zzz.txt |
-a --absolute |
cygpath -a zzz.txt |
/home/hishidama/zzz.txt |
-p --path |
cygpath -up "$CLASSPATH" |
.:/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かどうか判定するのは、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を使ってC言語のソースをコンパイルして実行ファイル(exe)を作ることが出来る。
まず、vi(要インストール)か何かのエディターでソースを書く。(別にWindows上のエディターで書いてもいいんだけど)
$ cd $ vi sample.c
/home/hishidama/sample.c(C:\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(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(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」の順)を付けてやると、環境が初期化される様子も表示される。
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]