Cygwinの環境を複数作ったり、パッケージのインストールを自動化したりする(たった一つのスクリプトファイルだけで…魔法のように…Linuxライク環境が構築できる！)

<!--
<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>
-->

<div align="right">
👻2024/02/12-18:00 <kbd>18805 views</kbd>
</div>

<div align="center">
「<i class="fa fa-folder" aria-hidden="true"></i>ストック」してくれている方(55名ほど)<br />
  <a target="_blank" href="https://qiita.com/api/v2/items/1a182f187fd2a8df29c2/stockers?per_page=100&page=1">
    <b>https://qiita.com/api/v2/items/1a182f187fd2a8df29c2/stockers?per_page=100&page=1</b>
   </a>
</div>

<hr />

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="645" height="84" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-1312-matrix.gif" /></a>
</div>

<hr />

<!-- 新着メッセージ(ここから↓) -->

<kbd>2024/02/18</kbd> <img alt="new024_30.gif" src="https://raw.githubusercontent.com/javacommons/qiita/master/new024_30.gif" />
* インストールスクリプトを実行した際に、/usr/local/bin に [apt-cyg](https://github.com/kou1okada/apt-cyg) が自動的にインストールされるようにしました。
* パッケージのキャッシュディレクトリを %USERPROFILE%/.cyg-pkgs に統一しました。これにより、複数プロジェクトで同じパッケージを使っている場合に、ダウンロードが省略されるようになりました。

<kbd>2024/02/16</kbd> <img alt="new024_30.gif" src="https://raw.githubusercontent.com/javacommons/qiita/master/new024_30.gif" />
[『Cygwin を複数インストールする(CYG_HOMEの設定について)』](https://qiita.com/javacommons/items/4e52f0a7e2b895b1ff7d) を書きました。CYG_HOME を指定する際にユーザー名のフォルダがつかないようにする方法を説明しています。前から(2017年から)あった機能ですが説明するのを忘れてました。

<kbd>2017/05/20</kbd>
![jc-mini](https://raw.githubusercontent.com/javacommons/qiita/master/jc-mini.png) インストールスクリプトを更新しました。最新版の project1.bat を記事からコピーしてください(**「最終更新: 2017年5月20日 13:13:14」以降のスクリプトであればOKです**)。新機能として「::set CYG_HOME=.」のコメントアウトを解除(先頭の「::」を削除)すると「共通ホームディレクトリ」が使えるようになります。「set CYG_HOME=.」と指定すると「project1」ディレクトリの隣にユーザーのホームディレクトリが作成されるようになります。project2.batでも同様の指定をしておくとホームディレクトリを共通化できます。「set CYG_HOME=D:\home」のように絶対パスで指定することもできます。

<!-- 新着メッセージ(ここまで↑) -->

----

<div align="center"><h1>～補足情報・最新情報～</h1></div>

- tmux 実行時に「Shift+矢印キーでペイン間移動」「Ctrl+矢印キーでペインリサイズ」となるような /etc/tmux.conf が自動作成されるようになっています。(下図(スクリーンショット)は tmux を起動してペイン間移動とペインのリサイズをしているデモです)

 - tmux を実行するには ![tmux-icon.png](https://qiita-image-store.s3.amazonaws.com/0/140610/7444104c-28bf-f1a3-4749-7cc79fb8e5bb.png) をダブルクリックして起動します。または、![mintty-icon.png](https://qiita-image-store.s3.amazonaws.com/0/140610/354ffbc6-80b4-c4e8-75e8-4132c93d94b9.png) をダブルクリックしてターミナルを起動した後に `tmux` コマンドで起動します。(Bash Console からは tmux は起動できません)


 -  <kbd>Ctrl-b</kbd> <kbd>"</kbd> でウィンドウ内を上下に分割できます。<kbd>Ctrl-b</kbd> <kbd>%</kbd> でウィンドウ内を左右に分割できます。
 - <kbd>Ctrl-b</kbd> <kbd>&</kbd> と入力することで全ペイン一括終了(ウィンドウを削除)できます。「kill-window `****`? (y/n)」 というメッセージが出力されますので、<kbd>y</kbd> と入力するとウィンドウが削除されます。 
 - 「Shift+矢印キー(<kbd>Shift↑</kbd> <kbd>Shift↓</kbd> <kbd>Shift←</kbd> <kbd>Shift→</kbd>)でペイン間移動」ができます。「Ctrl+矢印キー(<kbd>Ctrl↑</kbd> <kbd>Ctrl↓</kbd> <kbd>Ctrl←</kbd> <kbd>Ctrl→</kbd>)でペインリサイズ」ができます。(下図(スクリーンショット)を参照)
 - http://kanjuku-tomato.blogspot.jp/2014/02/tmux.html 等で基本操作について学べます。(または `tmux` で[ググります](https://www.google.co.jp/search?q=tmux)) ただし、**tmux を初めて使う場合は「複数ウィンドウ」や「複数セッション」は 利用しないでウィンドウ内を複数ペインに分割して作業するだけにしておいた方が分かりやすいと思います**。

<a href="https://qiita-image-store.s3.amazonaws.com/0/140610/405034c9-e743-0ca0-89de-5498af0659bd.gif"><img alt="tmux.gif" width="1024" height="768" src="https://qiita-image-store.s3.amazonaws.com/0/140610/405034c9-e743-0ca0-89de-5498af0659bd.gif" /></a>

- **本文に記載されていませんが、このスクリプトには「パッケージのカテゴリーを指定してカテゴリーに含まれる全パッケージをインストールできる」機能があります。スクリプト(バッチファイル)内の「::set CYG_CATS=Archive,Python」となっている部分のコメントアウトを解除する(先頭の「::」を削除する)と有効になります。(尚、指定するカテゴリーによってはインストール時間が膨大になります)**

- **本文に記載されていませんが、このスクリプトは(パッケージ指定を変えなくても)再実行した際に指定したパッケージをアップデートします。スクリプトをダブルクリックするだけなので簡単で楽ちんです。**

- このスクリプトでのデフォルトの設定では、**Emacsをウィンドウモードで起動した時に最大化して起動するようになっています**。それを止めたい場合は、(このスクリプトのCYG_PKGSにemacs-w32パッケージを追加してインストール実行後) site-start.el を開いて以下の変更を行ってください。(「;」(セミコロン)によるコメントアウトや行削除で対応するとインストールスクリプトの再実行時に復活してしまうので、コメントアウトしたり消したりしないで「'maximized」の部分を「nil」に変更(編集)してください。**最大化して起動するのをデフォルトにしているのは、そういうユーザー要望が多かったからです**)

```bash
$ vi /usr/share/emacs/site-lisp/site-start.el
```

```el:/usr/share/emacs/site-lisp/site-start.el(変更前)
(set-frame-parameter nil 'fullscreen 'maximized)
```

```el:/usr/share/emacs/site-lisp/site-start.el(変更後)
(set-frame-parameter nil 'fullscreen nil)
```

<a href="https://qiita-image-store.s3.amazonaws.com/0/140610/d8dd6812-ac2d-0051-d742-7685d45f7323.png"><img alt="image.png" width="1024" height="768" src="https://qiita-image-store.s3.amazonaws.com/0/140610/d8dd6812-ac2d-0051-d742-7685d45f7323.png" /></a>

<a href="https://qiita-image-store.s3.amazonaws.com/0/140610/040f68b8-2247-6f93-e4ef-d86c2ff250ff.png"><img alt="image.png" width="1024" height="768" src="https://qiita-image-store.s3.amazonaws.com/0/140610/040f68b8-2247-6f93-e4ef-d86c2ff250ff.png" /></a>

<div align="center"><h1>～ここから本文～</h1></div>

<!--
<div align="center">
  <h2><b>今日のおすすめビデオ</b></h2>
      <a href="#video-son-dambi-as-amoled">
        <img title="メディアを再生" alt="Son Dambi-After School - Amoled"
          src="https://qiita-image-store.s3.amazonaws.com/0/140610/5d91a710-d84a-de10-4480-c4769ed0d1c8.png" />
      </a>
      <a href="#video_amami_tsubasa_angel">
        <img title="メディアを再生" alt="天海つばさ『翼の折れたエンジェル』MV(full version)"
          src="https://qiita-image-store.s3.amazonaws.com/0/140610/953b692c-911f-6608-0d61-bec72e64a0c7.png" />
      </a>
</div>

<div align="center">
  <a href="#video_sailormoon_eurobeat">
    <img title="メディアを再生" alt="『セーラームーン(ユーロビート)ver.』"
      src="https://qiita-image-store.s3.amazonaws.com/0/140610/94e4dd10-c2dc-ae7f-bfdc-f62fc1108ee6.png" />
  </a>
</div>

<div align="center">
  <br />
  <a title="メディアを再生" href="#video_rukawa_dancing_hero">😎瑠川リナ『ダンシング・ヒーロー』</a>
  <a title="メディアを再生" href="#video_cyborg_009_2012ver">😎サイボーグ009 主題歌『誰がために-2012ver.』</a>
</div>
-->

<hr />

<!--
<h1><b>前置き(概要とメリットの説明)</b> <a href="#a-%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB-">[前置きを飛ばして本題へ移動↓]</a></h1>
-->

<h1><b>前置き(概要とメリットの説明)</b></h1>

`#`😆たった一つのスクリプトファイルだけで…魔法のように…Linuxライク環境が構築できる！
`#`😆知り合いのPCにスクリプトを持ち込んで「おすすめ環境をささっと構築してあげる」なんてこともできます！
`#`😆国内外の多くの企業・学校において何千台ものPCにCygwin環境をセットアップするために用いられています。
`#`😆エクスプローラの[コンテキストメニューからbashウィンドウを開けるように設定する](#fbash-prompt-here%E3%82%92%E4%BD%BF%E3%81%86-)ことができます。
`#`😆[CygwinのXサーバーをインストールする](#e1-cygwin%E3%81%AEx-window%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86)ことで、あなたの(または会社の)PCがX端末【脚注[^1]】に早変わり！
`#`👻**Windows Vista, Windows 7, Windows 8/8.1, Windows 10 の32bit版および64bit版**に対応しています。
`#`👻**Windows PCがあれば、どこでもさくっと環境を構築して、使い慣れたLinux(UNIX)コマンドが使えます。**


[^1]: [https://ja.wikipedia.org/wiki/X端末](https://ja.wikipedia.org/wiki/X%E7%AB%AF%E6%9C%AB) X端末(エックスたんまつ、X Terminal)はコンピュータの一つ。X Window SystemのXプロトコルを用いた通信により、他のコンピュータ上(ホスト)で実行されたXクライアントアプリケーションの実行結果を表示させる端末である(もちろん入力も出来る)。描画部分(と入力部分)のみを実行するため、処理に負荷がかかる描画処理部分をハードウェア的に分離し、ホストをアプリケーションの処理に特化することで、ホストの負荷を軽減できる。

<div align="center">
  <img src="https://qiita-image-store.s3.amazonaws.com/0/140610/32de57bd-f92f-6027-c7db-1a0b822b1c1e.gif" "a.gif">
</div>

> **Cygwinのインストールは手間がかかるものだと思われてます(通常のインストール方法では実際にそうです)が、この手法を使えば「サクラエディタのインストールよりも簡単」ということにもなります。**
> 
> - 😆**Cygwinを使えばWindows上にPOSIX/LINUXに近い環境を構築できます。Cygwinには9,000以上のパッケージがあります(bash,fortran,gcc,g++,git,emacs,perl,python2,python3,ruby,vim等も使えます【脚注[^2]】)。また、(必要なら)X-Windowサーバーをインストールして使うことができます≪[本文](#e1-cygwin%E3%81%AEx-window%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86)を参照≫。**
> 
> - 😆**通常のCygwinのインストール方法ではPCの管理者ユーザーでないとインストールできませんが、このスクリプトでは標準ユーザーでもインストールができます。(いろいろな環境で作業される方にとっては重要なポイントです。インストールして使って…~~管理者にばれないうちに~~消しちゃえばいいんですから！)**
> 
> - 😆**特にパッケージを指定しなくても、bashとviはデフォルトでインストールされます。(viコマンドの実体は「Vim - Vi IMproved」ですが、コマンド名は「vi」または「view」です) 尚、デフォルトでインストールされるvi,viewコマンドは「vim-minimal」パッケージのもので、「vim」パッケージを追加インストールするとフルセット機能のvimコマンドが使えるようになります。(設定ファイルを編集するような用途だけであればデフォルト(「vim-minimal」パッケージ)のvi,viewコマンドで用が足りると思います)**
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/3a1b092c-2f95-e700-d889-fa8e024732e3.png)
> - 😆**パッケージ名に「git」を指定することでgitも容易に導入できます。**
> 
> - 😆**管理者権限がある場合には、エクスプローラのコンテキストメニューから任意のフォルダに対してbashウィンドウを開くことができるように設定できます≪[本文](#fbash-prompt-here%E3%82%92%E4%BD%BF%E3%81%86-)を参照≫。**
> 
> **この記事への短縮URLを登録しました。http://bit.ly/cyginst でアクセスできます。このアドレスにアクセスすると自動的に http://qiita.com/javacommons/items/1a182f187fd2a8df29c2 (この記事のURL)にリダイレクトされます。**

[^2]: https://cygwin.com/packages/package_list.html 『Cygwin Package List』

下の画面は「emacs-w32」パッケージ【脚注[^3]】をインストールして利用しているところ。emacs-w32や(必要なら)[X-Windowを導入する](#e-x-window%E3%82%92%E4%BD%BF%E3%81%86-)ことでマルチウィンドウで作業ができます。

[^3]: http://qiita.com/javacommons/items/f1d51413bf29d39dc060 『Cygwin では emacs パッケージではなく emacs-w32 パッケージをインストールしましょう！』

![a1.png](https://qiita-image-store.s3.amazonaws.com/0/140610/cfae9a40-41ad-8108-9560-6cd0a0e5dbe0.png)

![a2.png](https://qiita-image-store.s3.amazonaws.com/0/140610/efa328ab-785b-c42a-7bc8-0d530cdf4aff.png)

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/140610/d10e50e9-94c6-e330-c631-02cc373363d8.png)

![a4.png](https://qiita-image-store.s3.amazonaws.com/0/140610/73c7ccb8-b6db-397e-1180-98c52d77c9b9.png)

> `#`2017/03/30追記: 😆**管理者ユーザーでなくてもインストールできるようにスクリプト(バッチファイル)を修正しました。Cygwinの通常のインストール方法では、標準ユーザーでログインしている時には、管理者のパスワードを入力する必要がありましたが、このスクリプトでは標準ユーザーでも(パスワードの入力なしで)インストールが可能になりました。~~他人のPCにインストールさせてもらうとか、お父さんが管理者のPCにこっそりインストールするとか…できますね！~~**
> 
> `#`2017/04/01追記: 😆 **「set CYG_PKGS=」というふうにパッケージを全く指定しなくてもインストールできるようにスクリプトを修正しました。パッケージを全く指定しない場合はCygwinのデフォルトのパッケージのみがインストールされます。**
> 
> `#`2017/04/03追記: 😆 **[『「Bash Prompt Here」を使う』](#fbash-prompt-here%E3%82%92%E4%BD%BF%E3%81%86-)を追加しました。**

----

# A. はじめに [↩](#)

1台のPC上に、インストールするパッケージの違うCygwinの環境を複数作ったり、32bit版と64bit版の環境を混在させたり、複数のマシンで同じパッケージのCygwin環境をセットアップしたり・・・という時に役立つテクニックを(再度)ご紹介します。(必要なら)Xサーバーも簡単にセットアップ可能です。

> Cygwinのセットアッププログラム(「setup-x86.exe」または「setup-x86_64.exe」)のコマンドライン引数を使うやり方で、あまり知られていないテクニックですが、(初期)パッケージ管理のためのベストプラクティスとも言えるでしょう。

**今回の改訂(バージョンアップ)では、複数インストールした環境のそれぞれの名前をウィンドウのタイトルやコマンドプロンプトに表示させるようにしたことで、複数のbashウィンドウを立ち上げた時でもどの環境なのかが一目でわかるようになりました。また、環境名とともに「Cygwin32」または「Cygwin64」という表示もされるので、32bit Cygwinなのか64bit Cygwinなのかも即座に判別できます。**

> まるで、あなたのPCの中で複数のLinux VM(Linux仮想マシン)を飼うようなものです。Python開発、Ruby開発…諸々の用途毎に開発環境が要るわけですから、複数の開発プロジェクトに携わる場合にも重宝するでしょう。お気に入りのVimやEmacsを利用できるので作業効率も大幅アップ間違いなし！
> また、**一度環境が完成してしまえば、スクリプトファイル(単なるテキストファイル)を持っていくことで、どのPCにも同じ環境を再現(再構築)できる**のです。

- 😆すでにCygwinを通常の方法でインストールしている場合に、この記事で紹介する方法でCygwinをインストールしても既存のCygwin環境に影響を与えません。また、この記事で紹介する方法でインストールした環境が要らなくなったらフォルダ(下の例での「project1」とか「project2」)を個別に消す(削除する)だけでOKです。気軽にお試しください！
- 😆[以前に投稿した記事](http://qiita.com/javacommons/items/19a2a12f35f0451b7357)で同様の内容を紹介しました。非常に単純なスクリプト(バッチファイル)で分かりやすいので、その記事は修正せずに置いておきますが、今回の記事で紹介するスクリプトには以下のような「改善」が盛り込まれています。

## [前回の投稿(スクリプト)](http://qiita.com/javacommons/items/19a2a12f35f0451b7357)からの改善点:

- 😆事前に(手作業で)、Cygwinのセットアッププログラム(setup-x86.exe や setup-x86_64.exe)をダウンロードする必要がなくなりました。カレントディレクトリにセットアッププログラムが存在しない場合には、スクリプトが自動的に判断してダウンロードしてくれます。ということで、(今回は)インストールスクリプト単体で持ち歩けば良くなったので管理と運用が一段と楽になりました。
- 😆複数のCygwin環境をインストールした場合でも環境名(以下のスクリプト内の「CYG_NAME」で指定した文字列)が、起動用バッチファイルの名前に含まれているので、デスクトップ等にショートカットを作成する際にいちいち環境ごとにリネームする必要がなくなりました。(前回の記事で紹介したスクリプトでは、どの環境の起動用ファイルも全て「Cygwin.bat」という名前でしたが、改訂版では「Cygwin32 @project1.bat」のように起動用のファイルの名前がユニークになりました。また、ファイル名で環境名と32bit環境なのか64bit環境なのかが確認できます)
- 😆bashウィンドウのプロンプトやタイトルバーに環境名(以下のスクリプト内の「CYG_NAME」で指定した文字列)が表示されます。ウィンドウを一目みるだけで、どの環境なのかがわかります。タスクバーのサムネイルにも環境名が表示されるので、異なる環境のbashウィンドウを立ち上げている場合でも、タスクバーから復元(表示)させたいウィンドウを容易に選択できます。
- 😆**Windowsの標準ユーザーでも(管理者ユーザーでなくても) Cygwinのインストールが行えるようになりました。(2017/03/30に可能になりました)**

# B. スクリプト(バッチファイル)の利用方法 [↩](#)

## B1. インストールスクリプトの準備

インストールするフォルダを準備します。

- 😆Cドライブの直下は問題があるので避けてください(Dドライブ、Eドライブ…の直下はOK。Cドライブ配下でも「C:\cyginst」とかはOKです。)。
- 😆**インストールするフォルダのパスに空白や日本語を含めないでください。**
- 😆**また、インストールするフォルダのパスに「#」等の特殊記号も含めない方が良いみたいです。**
- 😆この記事のサンプルでは「Z:\dev\cygwin」というフォルダを作成して用いました。

> **よく分からない場合は、デスクトップにスクリプトを置いても良いです。また、管理者ユーザーでなくても「C:\Users\Public」フォルダの下には自由にフォルダが作れます。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/103c66e0-b5b4-db84-d502-e855674adc9e.png)


そのフォルダの中に以下のテキストを保存します。名前は「project1.bat」としてください(バッチファイルの名前は何でも良いのですが、スクリプト(バッチファイル)内で「set CYG_NAME=**project1**」としているので「project1」というファイル名にします。拡張子は必ず「.bat」にします)。

> 尚、エクスプローラで「拡張子が表示される」設定にして作業をしないと「project1.bat.txt」というファイル名になっていまうことがあります。エクスプローラの拡張子表示設定については、[こちら](https://goo.gl/Ws6931) [※](https://goo.gl/Ws6931+) 等をご覧ください。

<a id="project1.bat" />

<a href="#">↩<img alt="new024_30.gif" src="https://raw.githubusercontent.com/javacommons/qiita/master/new024_30.gif" /></a>

```text:project1.bat
@if(0)==(0) echo off
:: URL: http://bit.ly/cyginst
:: 最終更新: 2024年02月17日 10:04
setlocal

REM --- 編集するところ(ここから↓) ---
set CYG_NAME=project1
set CYG_BITS=64
::set CYG_CATS=Archive,Python
set CYG_PKGS=procps,psmisc,tmux,vim
set DT_ICONS=1
::set CYG_HOME=.
REM --- 編集するところ(ここまで↑) ---

REM --- デバッグ/カスタマイズ(ここから↓) ---
set CYG_DEBUG=0
set CYG_SITE=http://mirrors.kernel.org/sourceware/cygwin/
set CYG_LANG=ja
set CYG_FONT=MS Gothic
set CYG_FONT_HEIGHT=16
set CYG_CURSOR_TYPE=block
set CYG_CONFIRM_EXIT=no
REM --- デバッグ/カスタマイズ(ここまで↑) ---

cscript.exe //nologo //E:JScript "%~f0"
call cyginst.bat SUBPROC
endlocal
pause
exit /b
goto :EOF
@end
var fso = new ActiveXObject("Scripting.FileSystemObject");
var SCRIPT_CURRENT_DIR = fso.getParentFolderName(WScript.ScriptFullName);
var url = "https://raw.githubusercontent.com/cyginst/cyginst-v1/master/cyginst.bat";
var fileName = SCRIPT_CURRENT_DIR + "\\cyginst.bat";
try {
  downloadFile(url, fileName);
} catch (e) {
  WScript.Echo("cyginst.bat をダウンロードできませんでした");
}
WScript.Quit();
function downloadFile(url, fileName) {
  var StreamTypeEnum  = { adTypeBinary: 1, adTypeText: 2 };
  var SaveOptionsEnum = { adSaveCreateNotExist: 1, adSaveCreateOverWrite: 2 };
  var http = WScript.CreateObject("MSXML2.XMLHTTP");
  var strm = WScript.CreateObject("ADODB.Stream");
  http.Open("GET", url, false);
  http.Send();
  strm.Type = StreamTypeEnum.adTypeBinary;
  strm.Open();
  strm.Write(http.responseBody);
  strm.SaveToFile(fileName, SaveOptionsEnum.adSaveCreateOverWrite);
}

```

<a href="#">↩<img alt="new024_30.gif" src="https://raw.githubusercontent.com/javacommons/qiita/master/new024_30.gif" /></a>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/b15f4905-4466-069b-71ad-380bda88ff00.png)

## B2. インストールスクリプトの起動

project1.bat をダブルクリックして実行します。「Cygwin Setup」ウィンドウが開きプログレスバーが表示されます。「Cygwin Setup」ウィンドウとは別にコマンドプロンプトも開きます。コマンドプロンプトにはインストール時に実行されるコマンドの詳細が表示されていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/bb29486f-642a-63d3-9298-804453c9997a.png)

インストールが完了すると、「Cygwin Setup」ウィンドウが閉じます。以下のようにコマンドプロンプト内で「続行するには何かキーを押してください．．．」と表示されたら、このコマンドプロンプトウィンドウを閉じて構いません。

![new.png](https://qiita-image-store.s3.amazonaws.com/0/140610/b62f3319-436a-1524-4941-90560dc28b30.png)

インストールスクリプト(project1.bat)のあるフォルダの中に(project1.bat の隣に) project1という(スクリプト内のCYG_NAMEと同じ)名前のフォルダができています。ここにCygwinがインストールされています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/80c61508-2bf9-891d-4ee4-905a15f5759d.png)

「project1」フォルダを開いて中身を確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/14e03d75-b872-fccd-2c12-aa902d584551.png)

デスクトップ上のアイコンは以下のように表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/a0f2b3bb-a225-f89a-0db8-98a0dd08d11c.png)

デスクトップ上の「Bash Console `@`project1 (32bit)」をダブルクリックして、Bash Consoleを起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/b683064f-d357-e9d6-9d7d-a63ad846d2d3.png)

起動したBash Consoleウィンドウを最小化して、タスクバーのアイコンにマウスカーソルを重ねてみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/90eb387e-278d-7f51-809e-8dae1cd1784f.png)

## B3. インストールスクリプトの再実行

「project1.bat」をテキストエディタで再度開いて「set CYG_PKGS=procps,psmisc,tmux,vim」という風になっている部分を修正しましょう。
例えば、「set CYG_PKGS=procps,psmisc,tmux,vim,**ruby**」のように変更して保存します。「project1.bat」を再実行するとRubyが追加でインストールされます。

>**パッケージを増やして「project1.bat」を再実行する場合には「project1」フォルダーを残したまま(上書きで)実行してください。既にインストール済みのパッケージについてはダウンロードもインストール処理もされず、追加で指定したパッケージのみがダウンロードおよびインストールされます。**再インストール後、「Bash Console `@`project1 (32bit)」を起動して追加されたパッケージの確認をしてください。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/d24a90b9-6fee-bb71-72d7-ab10464f3690.png)
>
> CYG_PKGSにパッケージを追加する一方の場合は全く問題がないのですが、逆に、**CYG_PKGSからパッケージ指定を削除した場合はインストールスクリプトを再実行しても、環境から当該パッケージは削除されません。**(パッケージが余分に入っていても問題ないケースが多いと思いますが)他のマシンにインストールスクリプトを転送(コピー)して実行した場合にはパッケージ指定を解除した分がインストールされないわけですから、同一の環境を構築してテストすることを保証するために、(上記の例では)「project1」フォルダを完全削除した上でインストールスクリプトを再実行して**指定解除したパッケージを一掃しておく**のも良いかもしれません。
> **「project1」環境を使って有意な作業を行った場合には、「project1」フォルダを削除する前に、フォルダ内の「etc」「home」「usr\local」等のディレクトリをバックアップしておくこともお忘れなく。**

## B4. 自分でインストールスクリプトを作成する際の変更点

project1.bat をコピーして project2.bat を作成します。
スクリプト内で変更するのは以下の部分だけです。他の部分は変更しないでください。

```text:[project1.batより抜粋]
REM --- 編集するところ(ここから↓) ---
set CYG_NAME=project1
set CYG_BITS=32
::set CYG_CATS=Archive,Python
set CYG_PKGS=procps,psmisc,tmux,vim,ruby
set DT_ICONS=1
REM --- 編集するところ(ここまで↑) ---
```

- 😆「set CYG_NAME=project1」という行の「project1」を任意の名前に変更します。この名前でフォルダーができるので半角の英数字およびハイフン、アンダースコア、ピリオド等の文字で名前を構成しましょう。ここでは「project2.bat」というファイル名にしましたので、「set CYG_NAME=project2」という風にファイル名と合わせておくと良いと思います。
- 😆32bit版のCygwinをインストールするか、64bit版のCygwinをインストールするかは「set CYG_BITS=32」の部分を修正することで切り替わります。64bit版をインストールする場合は「set CYG_BITS=64」とします。(※ 一度インストールスクリプトを実行したら決してこの値を変更してはなりません。インストール後に変更したい場合には、project2フォルダ(CYG_NAMEで指定した名前のフォルダ)を完全に削除してから、インストールスクリプトを再実行してください)
- 😆「set CYG_PKGS=procps,psmisc,tmux,vim,ruby」となっている個所の「procps,psmisc,tmux,vim,ruby」の部分を変更します。カンマ区切りでCygwinのパッケージの名前を列挙します。(パッケージ名は、「setup-x86.exe」または「setup-x86_64.exe」を手動で起動するなどして調べてください。または、ここでもパッケージ名を調べられます⇒ [https://cygwin.com/packages/package_list.html](https://goo.gl/Fa7t1n)) [※](https://goo.gl/Fa7t1n+)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/a7785f7c-18a8-a26d-b764-b8c5a44ea734.png)

# C. Cygwinの使い方など [↩](#)

## C1. Bash Console画面での文字列のコピーについて

![コンソール画面での文字列のコピーについて-a.png](https://qiita-image-store.s3.amazonaws.com/0/140610/eeefcc30-845f-b0fa-98ae-ff2361589937.png)

![コンソール画面での文字列のコピーについて-b.png](https://qiita-image-store.s3.amazonaws.com/0/140610/43821229-5723-9847-6f4d-f4fd1e38bc57.png)

![コンソール画面での文字列のコピーについて-c.png](https://qiita-image-store.s3.amazonaws.com/0/140610/55db67f9-96ec-cd3e-dc4c-f943d51367f1.png)

## C2. cygstartコマンドについて

Cygwinには「cygstart(.exe)」というコマンドが用意されています。

$ cygstart .

で(エクスプローラで)カレントフォルダを開くことができます。

また、a.txt という**ファイルが存在する場合**には

$ cygstart a.txt

で「.txt」に関連付けられたエディタ(メモ帳等)が起動されます。

Windows標準のコマンドプロンプトにおける「start .」「start a.txt」に相当します。
カレントフォルダを開く機能は「TortoiseGit」を使っている時などにも重宝します。

## C3. ターミナル(Cygwin Terminal)を使う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/25e28e5b-f3db-b99a-0433-2d66aa2a5d64.png)

または「Bash Console `@`project1 (32bit)」を起動した後で

```
$ mintty
```
```
$ mintty --size 160,48
```
```
$ mintty --window max
```

で「Cygwin Terminal」が起動します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/95e94ae9-df93-173f-924a-edfdd6147666.png)

![a4.png](https://qiita-image-store.s3.amazonaws.com/0/140610/73c7ccb8-b6db-397e-1180-98c52d77c9b9.png)

# D. パッケージ紹介 [↩](#)

パッケージを探す前に、使いたいコマンドがすでにインストールされていないか確認してください。
「ls /usr/bin」で一覧を見るか「which ＜コマンド名＞」で探してみてください。

>Cygwinの全パッケージ一覧: [https://cygwin.com/packages/package_list.html](https://goo.gl/Fa7t1n) 『Cygwin Package List』[※](https://goo.gl/Fa7t1n+)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/a75ce043-5ccd-54b7-00bb-aec11ba3ab76.png)

>Cygwinではインストールするパッケージを全く指定しなくてもいくつかのパッケージ(or コマンド)がデフォルトでインストールされます。また、パッケージをインストールすると依存パッケージがインストールされることがあるので、他のパッケージをインストールした時に所望のパッケージ(or コマンド)がインストールされていることがあります。

## D1. emacs を使いたい

- 😆インストールスクリプトの CYG_PKGS に **emacs-w32** を追加してください。

```text:コンソールモードで起動
$ emacs -nw
または
$ emacs -nw abc.txt
```

```text:ウインドウモードで起動
$ emacs &
または
$ emacs abc.txt &
```

## D2. ftp, telnet を使いたい

- 😆インストールスクリプトの CYG_PKGS に **inetutils** を追加してください。

```text:inetutilsで追加されるコマンド
ftp.exe
talk.exe
telnet.exe
```

## D3. scp, sftp, ssh を使いたい

- 😆インストールスクリプトの CYG_PKGS に **openssh** を追加してください。(**但し、gitパッケージをインストールした場合には依存関係で同時にインストールされています**)

```text:opensshで追加されるコマンド
cygrunsrv.exe
scp.exe
sftp.exe
ssh.exe
ssh-add.exe
ssh-agent.exe
ssh-keygen.exe
ssh-keyscan.exe
```

## D4. gcc, g++ を使いたい

- 😆インストールスクリプトの CYG_PKGS に **gcc-g++** を追加してください。(😆必要に応じて **make** パッケージ等も追加します)

```text:gcc-g++で追加されるコマンド
addr2line.exe
ar.exe
as.exe
c++.exe
c++filt.exe
cpp.exe
desktop-file-install.exe
desktop-file-validate.exe
dlltool.exe
dllwrap.exe
elfedit.exe
g++.exe
gapplication.exe
gcc.exe
gcc-ar.exe
gcc-nm.exe
gcc-ranlib.exe
gcov.exe
gcov-tool.exe
gdbus.exe
gio.exe
gio-querymodules.exe
glib-compile-schemas.exe
gobject-query.exe
gprof.exe
gsettings.exe
i686-pc-cygwin-c++.exe
i686-pc-cygwin-g++.exe
i686-pc-cygwin-gcc.exe
i686-pc-cygwin-gcc-5.4.0.exe
i686-pc-cygwin-gcc-ar.exe
i686-pc-cygwin-gcc-nm.exe
i686-pc-cygwin-gcc-ranlib.exe
i686-pc-cygwin-pkg-config.exe
ld.bfd.exe
ld.exe
nm.exe
objcopy.exe
objdump.exe
pkg-config.exe
ranlib.exe
readelf.exe
size.exe
strings.exe
strip.exe
update-desktop-database.exe
update-mime-database.exe
windmc.exe
windres.exe
xmlcatalog.exe
xmllint.exe
```

## D5. pkill, top 等を使いたい

- 😆インストールスクリプトの CYG_PKGS に **procps** を追加してください。

```text:procpsで追加されるコマンド
free.exe
pgrep.exe
pidof.exe
pkill.exe
pmap.exe
prockill.exe
procps.exe
top.exe
uptime.exe
vmstat.exe
w.exe
watch.exe
```

```text:コマンド名でプロセスを殺す(pkillの使用例)
$ run Xwin :0 -multiwindow -listen tcp
$ pkill Xwin
```

```text:topコマンドの実行画面
$ top
```

![c.gif](https://qiita-image-store.s3.amazonaws.com/0/140610/31447c11-c023-f8c6-0843-99bac42fb700.gif)

## D6. killall, pstree 等を使いたい

- 😆インストールスクリプトの CYG_PKGS に **psmisc** を追加してください。

```text:psmiscで追加されるコマンド
fuser.exe
killall.exe
prtstat.exe
pstree.exe
```

```text:killall,pstreeの使用例
root@project1(Cygwin32) ~
$ pstree -p
?(1)───bash(6908)───pstree(724)

root@project1(Cygwin32) ~
$ pstree -p
?(1)─┬─bash(6908)───pstree(5716)
     ├─mintty(5104)───tmux(4484)
     ├─mintty(3328)───tmux(5860)
     └─tmux(1176)─┬─bash(5296)───vi(2472)
                  └─bash(384)───emacs-w32(6360)

root@project1(Cygwin32) ~
$ killall tmux

root@project1(Cygwin32) ~
$ pstree -p
?(1)───bash(6908)───pstree(5272)

root@project1(Cygwin32) ~
$
```

## D7. git を使いたい

- 😆インストールスクリプトの CYG_PKGS に **git** を追加してください。

```text:gitで追加されるコマンド
cygrunsrv.exe
git.exe
git-receive-pack.exe
git-shell.exe
git-upload-archive.exe
git-upload-pack.exe
rsync.exe
scp.exe
sftp.exe
ssh.exe
ssh-add.exe
ssh-agent.exe
ssh-keygen.exe
ssh-keyscan.exe
等
```

## D8. Subversion(svn) を使いたい

- 😆インストールスクリプトの CYG_PKGS に **subversion** を追加してください。

```text:subversionで追加されるコマンド
crypt.exe
svn.exe
svnadmin.exe
svnbench.exe
svndumpfilter.exe
svnfsfs.exe
svnlook.exe
svnmucc.exe
svnrdump.exe
svnserve.exe
svnsync.exe
svnversion.exe
```

# E. X-Windowを使う [↩](#)

X-Windowがなくてもプログラムの開発はできますが、Linux(UNIX系)のGUIプログラムはX-Windowを前提として動作しますので、(emacs-w32のような例外を除いて) Cygwinに移植されたGUIプログラムを動作させるにはX-Windowサーバー(一般には、Xサーバーと呼ばれることが多い)のインストールが必要になります。Cygwin環境自体にインストールする方法と、X-Windowサーバー(Xサーバー)機能を持った別のソフト(例: MobaXterm)をインストールして使う方法の2通りがあります。

## E1. CygwinのX-Windowサーバーを使う

X-Windowのインストールや応用についてはまた別の記事を書きたいと思いますが、とりあえずCygwinでX-Windowを動作させることができることをご確認いただきたいと思います。

project1.batを修正して「set CYG_PKGS=procps,psmisc,tmux,vim,**python3,idle3,xorg-server**」というふうにして再実行します。

```text:[project1.batより抜粋]
REM --- 編集するところ(ここから↓) ---
set CYG_NAME=project1
set CYG_BITS=32
::set CYG_CATS=Archive,Python
set CYG_PKGS=procps,psmisc,tmux,vim,python3,idle3,xorg-server
set DT_ICONS=1
REM --- 編集するところ(ここまで↑) ---
```

- 😆「idle3」はPython3のインタラクティブな開発環境で、X-Window上で動作します。
- 😆「xorg-server」はX-Windowサーバー(あなたのPCをX端末【脚注[^1]】に早変わりさせるもの)です。

project1.batの実行が完了したら「Bash Console `@`project1 (32bit)」を起動して以下のコマンドを入力します。(**以下のコマンドをこの記事からコピーして、Bash Consoleを右クリックすれば貼り付けできます**)

```text
$ run Xwin :0 -multiwindow -listen tcp

$ export DISPLAY=localhost:0.0

$ idle3 &
```

そうすると、以下のように「idle3」のウィンドウが開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/f0ef391b-4124-a4e7-64cc-07e17f89f9e2.png)

また、X-Windowサーバーを終了させるには以下のようにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/f720e018-7edc-8aec-1a3f-64a6a6d18a65.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/f4357b45-db5f-1e81-2ef9-044af054ddc9.png)

## E2. MobaXterm(X-Windowサーバー)を使う

複数のCygwin環境を使っている場合等には、どの環境でX-Windowサーバーを起動したら良いか迷いますよね。そういう場合は無料の「[MobaXterm (Home Edition)](https://goo.gl/EXxbnO)」[※](https://goo.gl/EXxbnO+)を使いましょう。

ブラウザで [http://mobaxterm.mobatek.net/](https://goo.gl/EXxbnO) にアクセスします。

![MobaXterm-a.png](https://qiita-image-store.s3.amazonaws.com/0/140610/271e764b-088f-19c1-484d-32f70e530a83.png)

![MobaXterm-b.png](https://qiita-image-store.s3.amazonaws.com/0/140610/51e90f91-e492-e208-dd6c-bc155e9f8c93.png)

![MobaXterm-c.png](https://qiita-image-store.s3.amazonaws.com/0/140610/2e7ac069-551b-9077-5a7b-9645714eba4d.png)

![MobaXterm-d.png](https://qiita-image-store.s3.amazonaws.com/0/140610/e1d7f04c-4484-9645-c650-f2c56ed87adb.png)

![MobaXterm-e.png](https://qiita-image-store.s3.amazonaws.com/0/140610/fae007a0-531d-5d1b-4ee5-3a650f39f170.png)

![MobaXterm-f.png](https://qiita-image-store.s3.amazonaws.com/0/140610/2f68b46f-11fd-d6ed-abb7-ac0b4b713667.png)

# F.「Bash Prompt Here」を使う [↩](#)

エクスプローラのコンテキストメニューに「Bash Prompt Here」という項目を追加する手順です。但し、Cygwinを複数インストールした場合でも1つの環境に対してしか有効にできません。また、この手順では**Windowsの管理者権限が必要になるので、標準ユーザーでログインしている場合には実行できません。**

## F1.「Bash Prompt Here」設定後イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/4888a265-3ad9-fc00-ae53-28c035a8ee2a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/f974f964-95cc-f6ea-1b20-86657f1460b9.png)

## F2.「Bash Prompt Here」のインストールおよび設定手順

- 😆project1.batを修正して「set CYG_PKGS=procps,psmisc,tmux,vim,**chere**」というふうにして再実行します。

```text:[project1.batより抜粋]
REM --- 編集するところ(ここから↓) ---
set CYG_NAME=project1
set CYG_BITS=32
::set CYG_CATS=Archive,Python
set CYG_PKGS=procps,psmisc,tmux,vim,chere
set DT_ICONS=1
REM --- 編集するところ(ここまで↑) ---
```

- 😆デスクトップまたは「project1」フォルダの「Bash Console `@`project1 (32bit)」というショートカットを右クリックして「管理者として実行」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/ce8098ff-01d1-43dd-bf8f-5a319142cc62.png)

- 😆bashプロンプトに対して以下のコマンドを実行します。これでエクスプローラから「Bash Prompt Here」が使えるようになります。(尚、「-c」オプションは現在のWindowsユーザーのみに対して「Bash Prompt Here」が設定されるようにするためのものです。全Windowsユーザーに対して設定する場合には「-c」を外すか代わりに「-a」を指定してください。「Bash Console」を開くか「Cygwin Terminal」を開くかは好みが分かれるかもしれませんので、ユーザー毎に設定する方が良いと思います)

```text
$ chere -c -f -i
```

また、「Bash Prompt Here」を実行した時に「Bash Console」ではなく「Cygwin Terminal」が開くようにする場合には以下のようにします。

```text
$ chere -c -f -i -t mintty -o '--window max'
```

>設定が完了したら「管理者として実行」で立ち上げたBash Consoleはすぐに閉じましょう。必要なら「Bash Console `@`project1 (32bit)」を実行して起動しなおします。

- 😆もし「Bash Prompt Here」が要らなくなったら、上記手順と同様にBash Console `@`project1 (32bit)」を右クリックして「管理者として実行」した上で以下のコマンドを入力します。

```text
$ chere -c -u
```
# G. 最後に [↩](#)

この手順でCygwinをインストールすると：

- 😆自分で作ったインストールスクリプト(上記の project1.bat や project2.bat)を持ち歩く(またはGoogleドライブやDropboxに入れておく)だけで、自分好みの環境がどこでも作れます。(管理者権限不要！スクリプトをダブルクリックして待つだけ！)
- 😆複数の、そして32bit版と64bit版の混在した開発環境を容易に構築できます。
- 😆再現性。インストールスクリプトを保持しておけば何時でも何処でも同じパッケージの環境を構築(再現)できます。通常の方法でセットアップすると、パッケージを手作業でポチポチ選択するので、そこが面倒だったり…しかも選択もれがあったり…。
- 😆インストールスクリプト(バッチファイル)のCYG_PKGS変数の設定を見るだけで、どのパッケージがインストールされているかすぐに分かります。また、CYG_BITS変数の設定を見れば、32bit環境をインストールしたのか64bit環境をインストールしたのかも確認できます。(**Cygwin環境に実際にインストールされているパッケージの一覧は「cygcheck -c」で確認することができるのですが、依存関係で(またはデフォルトで)インストールされた多くのパッケージも表示されてしまうので、「トップレベルで指定した(Cygwinの通常インストールではポチポチした)パッケージ」が何だったのかを把握しておくことは大切です**)

Bash ConsoleやCygwin Terminalのウィンドウタイトルや、コマンドプロンプトの従来ホスト名が表示されていた部分に「環境名(CYG_NAME)」を表示するようにしたことで、**あたかも「複数のLinux(UNIX)マシンを使い分けている」ような感覚になる**と思います。

## ついでに読んでほしい記事！

この記事内で「emacs-w32」というパッケージを紹介しました。単なる「emacs」パッケージではなく「emacs-w32」を薦めているのには理由があるんです。よろしければ以下の記事も併せてお読みください。

> [http://qiita.com/javacommons/items/f1d51413bf29d39dc060 (Cygwin では emacs パッケージではなく emacs-w32 パッケージをインストールしましょう！)](http://qiita.com/javacommons/items/f1d51413bf29d39dc060)

# おまけ(絵文字…コピペして使ってくださいな！) [↩](#)

## 01😀 02😬 03😁 04😂 05😃 06😄 07😅 08😆 09😇 10😉 11😊 12🙂 13☺️ 14😋 15😌 16😍 17😘 19😗 19😙 20😚 21😜 22😝 23😛 24😎 25😏 26😶 27😐 28😑 29😒 30😳 31😞 32😟 33😠 34😡 35😔 36😕 37🙁 38☹️ 39😣 40😖 41😫 42😩 43😤 44😮 45😱 46😨 47😰 48😯 49😦 50😧 51😢 52😥 53😪 54😓 55😭 56😵 57😲 58😷 59😴 60💤 61💩 62😈 63👿 64👹 65👺 66💀 67👻 68👽

- 😆コピー元: http://qiita.com/javacommons/items/a2d84cd7b6838cff4d63 『Safari, IE, Google Chrome, Firefox, Opera, Notepadで表示可能な絵文字』

----