UNIX講習会#1 基本コマンド編

このUNIX講習会シリーズは[こちらのウェブサイト](http://unix-intro.sb.ecei.tohoku.ac.jp/)にスライド形式で掲載しています．

---

## なぜ，UNIXなのか？なぜコマンドを使うのか？

* 操作記録をとりやすい
  * 打ち込んだコマンドをテキストに書き出すだけ
* 自動化しやすい
  * 実行したいコマンドをテキストに書いておくだけ
  * シェルスクリプトで繰り返し実行することも
* 計算サーバーが遠くにあっても快適に操作できる
  * GUI もリモートはできるけど遅い
* パイプ・リダイレクトを用いて複数のソフトを連携できる

---

## 今日抑えるべきこと

* ターミナルとお友達になる
* 基本コマンドの使い方
  * `cd`, `ls`, `cat`, `less`, `cp`, `mv`, `rm`, `mkdir`, `rmdir`,
    `pwd`
  * `open`: Mac のみ
* タブで補完する
  * コマンドを全部打ち込む必要はない！
* <kbd>Control-A</kbd>, <kbd>Control-E</kbd>, <kbd>Control/Option-F</kbd>, <kbd>Control/Option-B</kbd> を使う

このあとの話はすべて OS X 10.10.2 Yosemite のターミナルで作業することを前提とします．

---

## おまじない

* 最初に快適に使うための設定ファイルを読み込む
  * 具体的には色が付くようになったり，補完が賢くなったりします

```bash
$ curl -L -o ~/.zshrc https://j.mp/okmr-zshrc
$ chsh -s /bin/zsh # zshに変更する
```

* `$`記号は打ち込まない．
* `#`の後ろはコメントなのでいらない
* 二行目でパスワードを聞かれるので入力する
* 終わったらターミナルのウインドウを閉じて，新しいウインドウを開く

---

## おまじない2

ターミナルの設定を変更する

![terminal-option.png](https://qiita-image-store.s3.amazonaws.com/0/56302/e53404fe-fe2a-239c-f13b-2f8c547dc2a2.png "terminal-option.png")


---

## カレントディレクトリ1

* Directory = Folder
* Current Directory とは作業の中心となる場所
* コマンドを入力するときに，ファイル名等はカレントディレクトリからの相
  対的な場所として入力できる
* 確認方法
  * `$ pwd`

私の設定ファイルを導入している場合にはプロンプトの右側にも出ている．

![current-directory.png](https://qiita-image-store.s3.amazonaws.com/0/56302/e616daf9-a588-b60f-15ec-cca6f8fa5a3b.png "current-directory.png")


---

## カレントディレクトリ2

* 作業したいファイルがある場所に移動して作業するのが基本
* 移動するには`cd`を使う
  * Change Directory の略

例：Macのフォントが保存されているディレクトリに移動してみる

```bash
cd /System/Library/Fonts
```

---

## パスの書き方1

* ディレクトリやファイルの場所を指定する表記をパス(Path)という
* 絶対パス
  * カレントディレクトリからではなく，Rootから表記したパス
  * カレントディレクトリにかかわらず同じ表記
* 相対パス
  * カレントディレクトリからみて相対的に表したもの
  * カレントディレクトリが変わると変わる

---

## パスの書き方2 絶対パス

* `/`から始めるとルートディレクトリからの表記になる
  * すべてのファイルとディレクトリはルートディレクトリの下にある
* `~`から始めるとホームディレクトリからの表記になる
  * ホームディレクトリは個人の作業スペース
  * 基本的にはホームディレクトリの中で作業する
  * ホームディレクトリの外は大事なファイルがたくさんあるので触らない

---

## パスの書き方3 相対パス

* `/`や`~`から始めなければ相対パスになる
* 明示的に相対パスであることを示したければ`./`から始める
* 今，`/Users/yasu`にいるときに，`/Users/yasu/Documents`に移動したけれ
  ば，`cd Documents`と入力できる
* `.`: カレントディレクトリを表す
  * ただし，`.hoge`と書くとカレントディレクトリにある`hoge`ではなく，
    `.hoge`というファイルを指すので，`./hoge`と書く
* `..`: カレントディレクトリの一つ上のディレクトリを表す

---

## タブキーで補完しよう1

* 先ほどの例で`/System/Library/Fonts`に移動するときに，`/S`まで入力す
  ると，その次に来るのは`ystem/`以外にはあり得ない
  * なぜなら`/`には`S`から始まるディレクトリは`System`以外には無いから
* `cd /S`まで入力したらタブキーを押すと候補が1つしかなければ補完される
  * 候補が複数あるときには候補の一覧が出る（岡村設定ファイルのみ）
  * もう一度タブキーを押すと候補が選択できる
  * タブキーを複数回押すことで候補をたどれる

---

## タブキーで補完しよう2

* 今回は zsh を利用しているので，賢い補完ができる
  * 文脈に沿って適切な候補を出してくれる
  * 何も設定しなかった場合でもコマンド名・ファイル名は補完してくれる場合が多い

* 課題
  * `/System/Library/CoreServices`に移動しなさい
  * ただし，キーボードを叩いていい回数は14回まで

---

## タブキーで補完しよう3

## 解答

```
cd /S[Tab][Tab]C[Tab]o[Tab]r[Tab][Enter]
      |    |     |     |     +- ここで一つに絞られて補完
      |    |     |     +- Coから始まるディレクトリの候補
      |    |     +- Cから始まるディレクトリの候補が出る
      |    +- Library/ が補完される
      +- /System/ まで補完される
```

---

## cd の便利な使い方

* `cd`とだけ入力する
  * ホームディレクトリに移動する
* `cd -`と入力する
  * 直前までいたディレクトリに移動する

---

## Directoryの中身を表示1

* ディレクトリの中身を表示するのためには`ls`を使う
* `ls`はlistの略

例：`/System/Library/Fonts/`にあるファイルの一覧
```bash
$ cd /System/Library/Fonts/
$ ls
Apple Braille Outline 6 Dot.ttf      LastResort.ttf
Apple Braille Outline 8 Dot.ttf      LucidaGrande.ttc
Apple Braille Pinpoint 6 Dot.ttf     MarkerFelt.ttc
Apple Braille Pinpoint 8 Dot.ttf     Menlo.ttc
...
```

---

## Directoryの中身を表示2

* `ls`の後ろにディレクトリ名を指定することもできる

例：`/System/Library/Fonts/`にあるファイルの一覧
```bash
$ ls /System/Library/Fonts/
Apple Braille Outline 6 Dot.ttf      LastResort.ttf
Apple Braille Outline 8 Dot.ttf      LucidaGrande.ttc
Apple Braille Pinpoint 6 Dot.ttf     MarkerFelt.ttc
Apple Braille Pinpoint 8 Dot.ttf     Menlo.ttc
...
```

---

## Directoryの中身を表示3

* `ls -l`とすることで各ファイルの詳細が見える

```bash
$ ls -l /System/Library/Fonts/
total 424280
-rw-r--r--  1 root  wheel    263912  9 10  2014 Apple Braille Outline 6 Dot.ttf
...
#Permission   Owner Group   Filesize Modifdate  Filename （各列の意味）
```

* `ls -l`のように`-`で始まるものをオプションと呼ぶ
  * コマンドにオプションを与えることで挙動を調整できる
* `ls -lh`とすることでファイルサイズが人間に読みやすい形式で表示される

---

## Directoryの中身を表示4

* 普通の ls では `.` から始まるファイルは表示されない
* `.`から始まるファイルは設定ファイルなどに使われる
* `.`から始まるファイルを表示したいときは`ls -a`とする

例

```bash
$ cd ~/Library
$ ls -a
.localized              Autosave Information
Containers              Fonts
...
```

---

## オプションの指定の仕方

* 多くの場合`-`が1つの場合にはその後ろの文字は一文字ずつオプションに
  対応する
* 複数指定するときはまとめることができる
  * 例：`ls -l -h -a`と`ls -lha`は同じ
* 多くの場合`--`が2つ以上続くときには文字列がオプションを意味するので
  まとめられない
  * 例：`ls --color`は`ls -c -o -l -o -r`とは違う（`--color`オプション
    はLinuxのみ）
* 例外もあるので絶対的なルールではない
  * 例：Javaのバージョンは`java -version`で確認する

---

## ls の主なオプション

* `-a`: `.`から始まるファイルを表示する
* `-l`: 各ファイルの詳細を表示する
* `-h`: `-l`と同時に使い，ファイルサイズを人間が読みやすい形で表示する
* `-F`: ディレクトリの後ろには`/`をつけ，実行ファイルの後ろには`*`をつ
  ける
* `-R`: ディレクトリの中身を再帰的に表示する

余談だが Windows では `dir` コマンドを使う．オプションは全く違う

---

## 岡村設定ファイルでは

いくつかよく使うコマンドについて Alias を設定している

* `l`: `ls -F`とほぼ同じ
* `ll`: `ls -lh`とほぼ同じ
* `la`: `ls -a`とほぼ同じ
* `lla`: `ls -lha`とほぼ同じ

「ほぼ」と書いたのは色をつけるためにMacとLinuxで違うオプションを指定しているため

---

## ファイルの中身を確認 1

* ファイルを確認するためには `cat` コマンドを使う
  * Concatenate の略
  * 名前の通り複数のファイルを結合もできる
* ファイルの中身がすべてターミナルに表示されるので，長いファイルでは注意

例：

```bash
$ cd /System/Library/OpenSSL/misc
$ cat c_info
#!/bin/sh
#
...
```

---

## ファイルの中身を確認 2

* 大きなファイルを確認するためには `less` コマンドを使う
  * 昔 `more` というコマンドが使われていて，その逆で`less`になった
* 巨大なファイルでも高速に表示できる

```bash
$ cd /System/Library/OpenSSL/misc
$ less CA.sh
```

---

## lessの使い方

* `less` はキーボードで操作できる


* `q`: lessを終了
* `j`: 次の行
* `k`: 前の行
* `f`: 次のページ
* `b`: 前のページ
* `g`: ファイルの先頭
* `G`: ファイルの末尾

カーソルキーは使わないことに慣れる

---

## ファイルをコピーする

* ファイルをコピーするためには `cp` コマンドを使う
  * Copy の略（ちなみにWindowsでは`copy`）
  * `cp source destination`の形で使う
  * `destination`に既存のディレクトリを指定すると，そのディレクトリに
    元と同じ名前でコピーされる

```bash
$ cd /System/Library/CoreServices/Finder.app/Contents/Resources/
$ cp Finder.icns ~/Desktop/ # Finderのアイコンをデスクトップにコピー
$ cp Finder.icns ~/Desktop/finder-icon.icns
## Finderのアイコンをデスクトップにfiner-icon.icnsという名前でコピー
```

* ディレクトリのコピーをするときには `cp -R` として再帰的にコピーを行
  うオプションをつける

---

## ファイルを移動する

* ファイルを移動するためには `mv` コマンドを使う
  * Move の略（ちなみにWindowsでは`move`）
  * `mv source destination`の形で使う
  * `destination`に既存のディレクトリを指定すると，そのディレクトリに
    元と同じ名前でコピーされる

```bash
$ cd ~/Pictures
$ mv ../Desktop/Finder.icns . # デスクトップにある Finder.icns をPictures にコピー
$ mv Finder.icns file-browse.icns  # Finder.icns を file-browse.icns に名前変更
```

* `cp`も`mv`も問答無用でファイルを上書きするので注意！

---

## ファイルをまとめてコピー・移動する

* `cp`も`mv`も`source`に複数のファイル名を指定できる
  * その場合は`destination`は既存のディレクトリでなければならない

```bash
$ cd /System/Library/CoreServices/Finder.app/Contents/Resources/
$ cp iCloudDrive.png iCloudDrive@2x.png ~/Desktop
## iCloudDrive.png と iCloudDrive@2x.png をデスクトップにコピーする
```

---

## GLOBを使う

* GLOBを使うと複数のファイルを指定するのが楽

```bash
$ cd /System/Library/CoreServices/Finder.app/Contents/Resources/
$ cp iCloud*.png ~/Desktop
## iCloud から始まり， .png で終わるファイルをデスクトップにコピーする
```

* `*`は任意の文字数に，`?`は任意の1文字に対応する
* <kbd>Tab</kbd>でどのファイルが指定されているかを確認できる
  * 上の例では`iCloud*.png`のどこかにカーソルキーがある状態で
    <kbd>Tab</kbd>を押すと`iCloudDrive.png iCloudDrive@2x.png
    iCloudNoDocs.png iCloudNoDocs@2x.png`と展開される（岡村設定）
  * <kbd>Control-_</kbd>で元に戻る

---

## 履歴を使いこなす 1

* 打ち込んだコマンドはすべて`.zsh_history`というファイルに保存されている
* 履歴を呼び出すことで繰り返し同じコマンドを入力する必要がなくなる


* <kbd>Control-P</kbd>: 前のコマンドを表示する (Previous)
* <kbd>Control-N</kbd>: 次のコマンドを表示する (Next)
* <kbd>Control-R</kbd>: 前のコマンドを検索する (Reverse)
* <kbd>Control-S</kbd>: 次のコマンドを検索する (Search)

カーソルキーは使わない

---

## 履歴を使いこなす 2 例


```bash
$ cd /System/Library/CoreServices/Finder.app/Contents/Resources/
$ cp Finder.icns ~/Desktop/ # Finderのアイコンをデスクトップにコピー
$ cd ~/Desktop
$ ls
$ cd ~/Pictures
$ mv ~/Desktop/Finder.icns .
```

と打ち込んだあとに<kbd>Control-P</kbd>を1回押すと`mv
~/Desktop/Finder.icns .`が表示され，2回目を押すと`cd ~/Pictures`
が表示される


<kbd>Control-P</kbd>を押すたびにさかのぼる．<kbd>Control-N</kbd>で逆に
最近の履歴に戻れる

---

## 履歴を使いこなす 3 例

* <kbd>Control-P</kbd>は既に何か入力があるときには，入力されている文字
  から始まる履歴だけをたどる
* たとえば`$ cd `まで入力されているときに<kbd>Control-P</kbd>を押すと，
  `cd `から始まる履歴だけをたどれる
* 単純に履歴をたどりたいときはカーソルキーで（あまり使わないけど）


この設定は岡村設定ファイルのみ

---

## 履歴を使いこなす 4 例

* <kbd>Control-R</kbd>で過去に入力したコマンドを検索できる
* たとえば，今なら<kbd>Control-R</kbd>のあとに`Finder.app`と入力すると
  `cd /System/Library/CoreServices/Finder.app/Contents/Resources/`
  が表示されるはず．
* さらに前の履歴をたどりたいなら<kbd>Control-R</kbd>を繰り返す
* 戻るためには<kbd>Control-S</kbd>


<kbd>Control-S</kbd>は設定によっては使えない場合もある

---

## キー操作を快適に

* コマンドを入力するときにカーソルキーで移動させると時間がかかる
* 便利なショートカットを覚えると楽になる


* <kbd>Control-A</kbd>: 行の先頭に行く (Ahead)
* <kbd>Control-E</kbd>: 行の末尾に行く (End)
* <kbd>Control-F</kbd>: 1文字右へ (Forward)
* <kbd>Control-B</kbd>: 1文字左へ (Back)
* <kbd>Option-F</kbd>: 1ブロック右へ (Forward)
* <kbd>Option-B</kbd>: 1ブロック左へ (Back)


カーソルキーは使わない

---

## ファイルを削除する

* ファイルをコピーするためには `rm` コマンドを使う
  * Remove の略（ちなみにWindowsでは`Del`）

```bash
cd ~/Desktop
rm iCloudDrive.png # iCloudDrive.png を削除
```

* ゴミ箱にも入らずにいきなり消えるので注意
* GLOBを使うときには予期せぬファイルを削除しないか確認してから
  * <kbd>Tab</kbd>展開してで指定されるファイルを
  * それができない場合には，`rm *.png`の前に`ls *.png`のように，`ls`で
    確認してから実行する

---

## ディレクトリをつくる

* ファイルをコピーするためには `mkdir` コマンドを使う
  * Make Directory の略（ちなみにWindowsでも`mkdir`）

```bash
cd ~/Desktop
mkdir MyDirectory
```

`-p`をつけることで深いディレクトリを一度につくれる

```bash
cd ~/Desktop
mkdir -p first/second/third
```


---

## ディレクトリを削除する

* ファイルをコピーするためには `rmdir` コマンドを使う
  * Remove Directory の略（ちなみにWindowsでも`rmdir`）
* ディレクトリを削除するためにはディレクトリが空でなくてはならない

```bash
cd ~/Desktop
rmdir MyDirectory
```

* 空でないディレクトリを削除するときには`rm -r`
  * 普段は`rm -r`を使うことが多いので，`rmdir`はめったに使わない

---

## GUIとCUIの狭間

* ターミナルで作業していて，GUIで操作したくなった場合には`open`コマンドを使う（ちなみに Windows では `start`）

```bash
cd ~/Desktop
open iCloudDrive@2x.png # デスクトップにある iCloudDrive@2x.png を開く
```

`open` コマンドを使うことで Finder でダブルクリックしたことと同じになる

---

## 基本コマンドの意味

* `cd`: Change Directory
* `ls`: List
* `cat`: Concatenate
* `less`: moreの反対（歴史的な理由）
* `cp`: copy
* `mv`: move
* `rm`: remove
* `mkdir`: Make Directory
* `rmdir`: Remove Directory

---

## おまけ

ターミナルのおすすめフォント設定

* OSAKA 14pt アンチエイリアス無し
  * Retina ディスプレイでない場合には見やすい
* Adobe Source Code Pro
  * Retina ディスプレイや Emacs のフォントはこれにしている
* M+