【Terminal】Macのターミナル操作に慣れてみよう

# はじめに
この記事は以下のターゲットを想定して書いてます。
- Macのターミナルを触ったことがなく、よくわからない...
- え...？シェルって何...？
- え...？パスを通すって何...？サッカー？

という方へ **完全初心者向け** の記事です。

したがって、基礎的な概念から雑多に記載してます。

ただ、初心者の方にはかなり分量があり、補足の中で複雑な内容まで踏み込んで説明しています。仕組みとかはどうでもいいや思う方は<font color="red">**基本コマンド**</font>だけでも、覚えて帰ってください！

この記事を理解するのに役立つと思い、基礎的な概念の理解を助ける資料も付けておきました。難しい単語などにはリンクを付けておいたので、ぜひご活用ください → [**補足資料**](#補足資料)

全て理解できれば、基礎はバッチリ固まるので、難しい記事も読めるようになるかも...！

# 目次
- [コマンドが実行される仕組み](#コマンドが実行される仕組み)
    - 補足
        - コマンドが格納されているフォルダとは
- [ターミナルとは](#ターミナルとは)
- [ターミナルを起動してみよう](#ターミナルを起動してみよう)
    - 補足
        - pwdコマンドについて
        - ~(チルダ)について
- [ターミナルの基本操作](#ターミナルの基本操作)
    - 補足
        - コマンド履歴
        - 補完機能
- [**基本コマンド**](#基本コマンド)←これだけでも覚えて！
- [補足資料](#補足資料)
    - カーネルについて
    - パスについて
    - echoコマンドについて



# コマンドが実行される仕組み
シェルやコマンドに触れる前に、<font color="red">**コマンドを入力して実行されるまでの仕組み**</font>を簡単に理解しておきましょう。

コマンドが実行される一連の流れは以下の通りです。

**① キーボードからターミナルに入力された文字列を受け取る**
**② 受け取った文字列のコマンドを検索**
**③ コマンドが見つかった場合、そのコマンドを実行**
**④ 実行結果をターミナルに返す**

このプロセスのうち、③はMacのOSの中核である[**カーネル**](#カーネルについて)が行います。<br><br>

ここで、シェルの役割は一言で言うならば「**<font color="red">カーネルのインターフェース</font>**」です。つまり、シェルはユーザーとカーネルの仲介してくれているのです。<br><br>

例えば、lsコマンド( ディレクトリの一覧を表示するコマンド. 詳しくは後述. )をターミナル上で実行するとします。この時の実行されるまでの流れは以下の通りです。

**①シェルがキーボードから「ls」という入力を受け取る**
**②シェルが「ls」というコマンドをコマンドが格納されているフォルダの中から検索**
**③合致したコマンドを<font color="red">カーネル</font>に実行依頼する**
**④シェルが出力結果をユーザーの画面に出力**<br>
といった具合です。
以下はコマンドが実行されるまでの概念図です。<br>
![DBE1AD66-4261-44A0-8727-3BBAB4E8C3EF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/4ad46050-6339-fdc6-3d91-aef4a2ba354e.jpeg)

### 補足
* コマンドが格納されているフォルダとは？

説明の中で出てきた「**コマンドが格納されているフォルダ**」について補足します。

コマンドとは一般に**ファイル**のことであり、皆様が普段使われているようなテキストファイルなどと同じような要領のものです( 厳密には異なるが... )

これらのコマンドファイルは「/bin」や「/usr/bin」というフォルダに格納されていることが多いです。(この「/」などのパスの話が難しい方は「**[パスについて](#パスについて)**」をご参照ください)

whichというコマンドで、そのコマンドがどこに格納されているのか確かめることできます。それではlsコマンドがどこに存在しているのか確かめてみましょう。
```
hoge@host ~ % which ls

#出力
/bin/ls
```
**lsコマンドは/bin/というフォルダの中のlsファイルであることが確認できました。**
気になる方は他のコマンドも確かめてみてください！

# ターミナルとは
前節でシェルについて説明しましたが、**ターミナルとシェルは別物**であることに注意が必要です。
違いは以下の通りです。<br>

* シェル
ユーザーとカーネル(OSの中核)とのインターフェースとして「コマンドの検索」,「カーネルに命令を出す」など様々なことを行う
<br>　
* ターミナル
<font color="red">**入力画面を提供するだけ**</font>のソフトウェア

この二つの言葉を混同しないように注意しましょう！
ターミナルを入力装置として、ファイルの作成、削除、移動、圧縮など様々なことを行うことができます。使えるようになると色々便利ですよ！

# ターミナルを起動してみよう
それでは、ここでようやくターミナルを起動してみましょう。
起動方法は、こちらの<a ref="https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac#:~:text=Finder%20%E3%81%A7%E3%80%81%E3%80%8C%2F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%2F,%E3%82%92%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82">リンク(外部リンク)</a>をご参照ください。

起動すると、以下のような画面が出ると思います。
![53362F9D-43AF-4F0E-88F0-B0DF6BBDF9D5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/470f0a97-78cc-ebbd-3809-c44f5a05abe9.jpeg)



ここで表示されている内容は以下の通りです。
* <font color="DeepSkyBlue">**hogeの部分 -> ユーザー名**</font>
* <font color="IndianRed">**hostの部分 -> ホスト名**</font>
* <font color="orange">**~の部分 -> カレントディレクトリ**</font>

<font color="red">**カレントディレクトリ**</font>とは、シェルの操作により、**現在自分が位置しているディレクトリ**のことです。現在は「~」というディレクトリにいることを示しています。
注意: ディレクトリとはフォルダと同義です。本記事では以後ディレクトリと呼びます。<br>

### 補足
ここでは話し足りなかったことを三点補足します。

一点目は、[pwdコマンド](#pwdコマンド)についてです。<font color="red">**カレントディレクトリはpwdコマンドで確認する**</font>ことができます。このpwdは諸説ありますが、「Print Working Directory」の略です。(カレントディレクトリはワーキングディレクトリとも呼ばれる)

二点目は ~(チルダ) についてです。~とは <font color="red">**ホームディレクトリ**</font>のことであり、ユーザーごとに用意された、個人用のディレクトリです。一人で使う分にはそこまで意識しなくても良いです。作業をする上で元となるディレクトリだと認識しておけば問題ないです。

三点目はチルダ展開についてです。ホームディレクトリの中で、pwdを実行すると、ホームディレクトリのパスが帰ってきます。この<font color="red">**ホームディレクトリのパスが ~ と同じ**</font>なのです。

以下のコマンドの実行結果をご覧ください。
```
hoge@host ~ % pwd
#出力
/Users/hoge

hoge@host ~ % echo ~
#出力
/Users/hoge
```
echoコマンドについて[こちらのリンク](#echoコマンド)をご参照ください。
ここで言いたいことは、<font color="red">**「~とホームディレクトリのパスは同じように扱える」**</font>ということです。

例えば、「/Users/hoge/Downloads」の中身を見たい時には、以下のようなことができます。
```
hoge@host ~ % ls /Users/hoge/Downloads
#出力
Downloadsの中身.....

hoge@host ~ % ls ~/Downloads
#出力
Downloadsの中身.....
```
このように、~と入力することで、ホームディレクトリのパスとして展開することを、<font color="red">**チルダ展開**</font>と言います。

# ターミナルの基本操作
ターミナルは基本的に<font color="red">**矢印キーでカーソルの操作**</font>を行います。
入力は通常通りキーボードから行い、削除もback spaceで行うことができます。

今までマウスでカーソル移動したり、まとめて選択して削除していた方は不便に感じるかもしれません。ここでは、そんな人のために私がよく使う**便利なショートカットキー**を幾つか紹介します！<br>

* 便利な移動方法

|キー入力  |内容  |
|---|---|
|Ctrl+a  |行頭に移動  |
|Ctrl+e  |行末に移動  |
|option+矢印(右or左)  |単語ごとに移動  |

* 便利な削除方法

|キー入力  |内容  |
|---|---|
|Ctrl+u  |全削除  |
|Ctrl+w  |一つ前の単語を削除  |

他にも様々なキー操作がありますが、一旦はここまでにしておきます！

### 補足
ここでは、さらに便利なターミナルライフを過ごすための便利機能を紹介します。

* コマンド履歴
コマンド履歴とは、一度実行したコマンドをもう一度簡単に呼び出すことのできる機能です。コマンド履歴を呼び出す方法は二つあります。<br>
1つ目は、<font color="red">**↑キーを入力する**</font>ことで一つずつ実行したコマンドを遡ることができます。
この方法は簡単なキー操作で行えるため、私自身頻繁に用いることがあります。しかし、だいぶ前に実行したコマンドまで戻るのは大変です。そこで二つ目の方法があります。<br>
2つ目の方法は <font color="red">**Ctrl + r**</font> と入力して検索を行うことができます。実行したコマンドの一部を入力することで検索にヒットしたコマンドが表示されます。複数件検索にヒットした場合、Ctrl + rを再度入力することで、ひとつ前のヒットコマンドに遡ることができます。そして、<font color="red">**Escキーを入力する**</font>ことで、そのコマンドをコマンドラインへ乗せることができます。

|キー入力  |内容  |
|---|---|
|↑  |ひとつ前の実行コマンド  |
|Ctrl + r  |コマンド履歴の検索、複数件ヒットの場合前のヒットコマンドへ移動  |
|Esc  |ヒットしたコマンドをコマンドラインへ移動 |
<br>

* 補完機能
補完機能は、途中まで入力をすれば残りは自動で入力してくれる機能です。非常に便利なのでぜひ覚えておきましょう。
補完機能は<font color="red">**Tabキーを入力する**</font>ことで用いることができます。<br>
例えば、カレントディレクトリにDownloadsというフォルダがあるとしましょう。この中身を確認するためには
<font color="DeepSkyBlue">**ls Downloads**</font>
というコマンドを実行しなければなりません。いちいちDownl...と入力するのは大変ですよね。そこで補完機能の登場です。
Dowまで入力した後に、Tabキーを押すとあら不思議、<font color="red">**自動でDownloadsと補完**</font>してくれます。要するに、「途中まで打ってTabを押すと自動で残りを入力してくれる」のです。

|キー入力  |内容  |
|---|---|
|Tab  |途中まで入力した内容を補完  |

# 基本コマンド
ここでは、ターミナルを使う上で<font color="red">**必ず覚えておきたいコマンド**</font>を紹介します。ぜひ以下のコマンドだけでも覚えてください！

コマンドを実行する前に<font color="DeepSkyBlue">**コマンド**</font>と<font color="IndianRed">**オプション**</font>と<font color="orange">**コマンドライン引数**</font>について紹介しておきます。

![E321F818-AE77-42B3-94E3-69FCB78694C2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/cd3bc33d-0576-5802-5f0a-0e6eafac40a5.jpeg)

コマンドを実行するにあたり、オプションやコマンドライン引数を設定することで<font color="red">**動作を細かく指定**</font>できます。

まず、<font color="IndianRed">**オプション**</font>とは、コマンドごとに用意されており、これを指定することで<font color="IndianRed">様々な動作を指定する</font>ことができます。例えば、lsコマンドには-lオプションが存在しており、このオプションを指定することで、名前だけではなく様々な情報を確認できるようになります。

:::note info
注意
コマンドごとに多くのなオプションがあるので、一気に覚えようとせずに、必要に応じてその都度調べましょう。何度も使ってくうちに必要なものは覚えていきます。
:::

次に、<font color="orange">コマンドライン引数</font>とは、<font color="orange">コマンドの動作対象を指定する引数</font>です。プログラミングを学んだ人には関数の引数のようなものと思ってもらえれば問題ないです。
上のコマンドの例では、中身を見たいディレクトリを指定しています。このように、コマンドの動作対象を指定するのがコマンドライン引数です。<br>


<br>それでは、先ほど起動したターミナルを用いてコマンドを一つずつ実行していきましょう。

## lsコマンド
lsコマンドとはディレクトリの中身を表示するコマンドです。
```
hoge@host ~ % ls

#出力　→ カレントディレクトリ(今回は~)の中身
Applications			Downloads			Movies				Public...
```
コマンドライン引数を指定しないと、<font color="red">**カレントディレクトリの中身**</font>が表示されます。
引数を指定することで、<font color="red">**指定したディレクトリの中身**</font>を見ることができます。

```
hoge@host ~ % ls 対象ディレクトリ

#出力 → 対象ディレクトリの中身
Dir1			Dir2....
```
また知っておきたいオプションについても紹介します。

|オプション  |内容  |
|---|---|
|-l  |ファイルの情報を詳細に表示する  |
|-A |全てのファイルやディレクトリを表示  |
|-F  |ファイルやディレクトリを識別する記号が末尾に表示 |

上記のオプションは覚えておくと、かなり便利です。
具体的にひとつ一つ見ていきましょう。

まず、説明のために以下のような構成のディレクトリを作成しました。

![9239D7E7-098F-478F-8D2D-FC4911E5B451.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/5a3af1de-d3ac-3e18-d8f2-e7cf8b959890.jpeg)

lsコマンドで中身を見てみます。
```
hoge@host Qiita % ls

#出力
dir1		dir2		file1.html	file2.html	file3.html
```
写真と出力結果の対応関係がきちんとわかると思います。

ただ表示名だけでは、どれがファイルでどれがフォルダかわかりにくいこともあると思います( 今回はわかりやすい名前にしましたが )。

そこで、オプションの出番です。

### -l オプション
まずは「-l」 オプションから見てみましょう。
```
hoge@host Qiita % ls -l

#出力
total 0
drwxr-xr-x  2 hoge  staff  64  2 23 15:46 dir1
drwxr-xr-x  2 hoge  staff  64  2 23 15:46 dir2
-rw-r--r--  1 hoge  staff   0  2 23 15:46 file1.html
-rw-r--r--  1 hoge  staff   0  2 23 15:46 file2.html
-rw-r--r--  1 hoge  staff   0  2 23 15:46 file3.html
```
ここでは、出力結果のうち一番左の「drwxr-xr-x」のような部分を理解しましょう。
このヘンテコなアルファベットの詳細は以下のようになってます。

![5C7D725F-6600-4DE7-820E-A6FA9BF6F9C6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/b90b9576-7151-e253-4467-141b7c824f65.jpeg)

<font color="IndianRed">**最初の文字が「d」ならディレクトリ、「-」ならファイル**</font>という意味です。

次の文字列は3文字ごとに見ていきます。それぞれ<font color="DeepSkyBlue">**「読み込み」「書き込み」「実行」の権限があるか**</font>を示しています。権限がない場合には「-」となっています。

ここで、なぜ3つも権限があるのかと思うでしょうが、今回は簡単な説明に留めておきます。OSでは複数のユーザーの使用が想定されており、ユーザーごとに権限を変えることができるようになっています。具体的にはユーザーに所属グループを割り当て、そのグループごとに権限を変えることができるといった具合です。そのグループが三つあるというイメージで問題ないです。

**一人で使う分には、このグループの概念はあまり意識しなくても問題ないです。**

### -A オプション
「-A」 オプションは、<font color="red">**隠しフォルダを表示する**</font>ことができます。
隠しフォルダとは<font color="red">**冒頭に「.」などがついているファイルやディレクトリ**</font>です。通常ホームディレクトリにもいくつかあります。

ホームディレクトリで実行して、オプションの有無で出力結果を比較しましょう。
今回は(恥ずかしながら)私の~ディレクトリを公開します。(いやん)

```
# Aオプションなし
hoge@host ~ % ls -A ~
# 出力
Applications			LightGBM_compilation.log	anaconda3			scikit_learn_data
Desktop				Movies				bin				zshrc
Documents			Music				miniforge3
Downloads			Pictures			myprj
Library				Public				nltk_data

# Aオプションあり
hoge@host ~ % ls -A ~
# 出力
.CFUserTextEncoding		.ipython			.wdm				Movies
.DS_Store			.keras				.xonshrc			Music
.Trash				.lesshst			.zprofile			Pictures
.anaconda			.matplotlib			.zsh_history			Public
.bash_profile			.mysql_history			.zsh_sessions			anaconda3
.cache				.python_history			.zshrc				bin
.conda				.rye				.zshrc_backup			miniforge3
.condarc			.sqlite_history			Applications			myprj
.config				.ssh				Desktop				nltk_data
.continuum			.tcshrc				Documents			scikit_learn_data
.cups				.viminfo			Downloads			zshrc
.docker				.vimrc				Library
.gitconfig			.vscode				LightGBM_compilation.log
```

見比べてもらうと、.がついているファイルが表示されてますね。
みんなのディレクトリにも隠れファイルがあるかも！

### -F オプション
最後に「-F」 オプションを見てみましょう。<font color="red">**Fオプションは識別子を末尾につけるオプション**</font>です。
最後は、-lオプションと同じく用意したQiitaディレクトリで実行してみましょう。

```
hoge@host Qiita % ls -F

# 出力
dir1/		dir2/		file1.html	file2.html	file3.html
```
<font color="red">**名前の末尾に「/」があればディレクトリ、なければファイル**</font>です。

## pwdコマンド
pwdコマンドは、<font color="red">**現在自分がいるディレクトリ(カレントディレクトリ)の[パス](#パスについて)を表示**</font>するコマンドです。

コマンド操作では、よく迷子になることがあります。そんな時にはこのpwdコマンドを実行することで、自分の位置を把握しましょう。
```
hoge@host ~ % pwd

# 出力
/Users/hoge
```

## cdコマンド
cdコマンドは、<font color="red">**ディレクトリの移動を行うコマンド**</font>です。
**Change Directoryの略**ですので、覚えやすいと思います。

cdコマンドはコマンドライン引数に注意が必要です。
コマンドライン引数に移動したいディレクトリを指定します。何も指定しないと、ホームディレクトリ(~)に移動します。

それではcdコマンドで移動してpwdコマンドで移動の確認をしてみましょう。
```
hoge@host ~ % pwd

# 出力 (現在位置)
/Users/hoge


hoge@host ~ % cd Downloads
hoge@host Downloads % pwd

# 出力 (移動後位置)
/Users/hoge/Downloads
```


## mkdirコマンド
mkdirコマンドは、<font color="red">**ディレクトリの作成を行うコマンド**</font>です。
**MaKe DIRectoryの略**ですので、覚えやすいと思います。

**コマンドライン引数**に**作成したいディレクトリの名前**を指定してください。

以下に使用例を挙げます↓
```
hoge@host Qiita % ls -F

# 出力 (作成前のディレクトリの中身)
dir1/		dir2/		file1.html	file2.html	file3.html


hoge@host Qiita % mkdir dir3
hoge@host Qiita % ls -F

# 出力 (作成後のディレクトリの中身)
dir1/		dir2/		dir3/		file1.html	file2.html	file3.html
```
dir3という名前の<font color="red">**ディレクトリが作成されている**</font>のが確認できると思います。

## touchコマンド
touchコマンドは、<font color="red">**ファイルの作成を行うコマンド**</font>です。

**コマンドライン引数**に**作成したいファイルの名前**を指定してください。
以下に使用例を挙げます↓
```
hoge@host Qiita % ls -F

# 出力 (作成前のディレクトリの中身)
dir1/		dir2/		dir3/		file1.html	file2.html	file3.html


hoge@host Qiita % touch file4.html
hoge@host Qiita % ls -F

# 出力 (作成後のディレクトリの中身)
dir1/		dir2/		dir3/		file1.html	file2.html	file3.html	file4.html
```

## rmコマンド
rmコマンドは、<font color="red">**ファイルやディレクトリの削除を行うコマンド**</font>です。
**RMoveの略**ですので、覚えやすいと思います。

**コマンドライン引数**に**削除したいファイルやディレクトリ**を指定します。

ただ、注意が必要で、<font color="red">**オプションを指定しないとファイルしか削除できません**</font>。
ディレクトリを削除したい場合には「-r」オプションを指定する必要があります。
このrとはRecursiveの頭文字であり、再帰的に削除をすることを指定するオプションです。従って、ディレクトリのような複数ファイルが含まれているものでも再帰的に削除することできます。

## まとめ
紹介したコマンドについて、まとめを掲載します。
今一度確認してみてください。

|コマンド  |内容  |
|---|---|
|ls  |ディレクトリの中身を表示 |
|pwd |カレントディレクトリのパス表示  |
|cd  |ディレクトリの移動 |
|mkdir  |ディレクトリの作成 |
|touch  |ファイルの作成 |
|rm  |ファイルやディレクトリの削除 |

## 補足資料
ここでは、この記事を読むために必要な概念を簡単に紹介します。

### カーネルについて
カーネルとは、<font color="red">**「OSの基本機能の役割を担うソフトウェア」**</font>のことです。

まず、**OS**とは皆さんのパソコンにも入っているWindowsやMacと呼ばれるものです。OSはOperation Systemの略であり、我々の操作を解釈して実際にパソコンの中で実行してくれるものです。その他、様々な機能がありますが、ここでは割愛します。

そんなOSの中核と呼ばれているのが<font color="red">**カーネル**</font>です。ユーザーがアプリケーションを実行するときに、このリクエストをカーネルが処理して実行してくれます。

つまり、カーネルとは、<font color="red">**我々とPCを結びつけてくれる大きな役割を持ったもの**</font>と認識してくれれば問題ないです。

### パスについて
パスとは、<font color="red">**ディレクトリやファイルの住所**</font>のようなものです。

具体的には、目的のファイルまでの経路のディレクトリを階層的に繋ぎ合わせた文字列であり、**絶対パスと相対パスの2種類**が存在します。この繋ぎの部分はOSごとに異なりMacでは「/」で繋ぎ合わせを行います。

詳細は以下の概念図を参照してください。

![69E7D04D-CCDC-4036-A10B-80527C16A6CE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508599/6e1bf128-287f-ddff-731a-0ab78be3eade.jpeg)

いくつかわからない単語があると思うので簡単に説明します。
まず、**ルートディレクトリ**とは、PCにおいて最上位に位置するディレクトリであり、全てのディレクトリやファイルはこの中に格納されています。

この<font color="DeepSkyBlue">**ルートディレクトリから**</font>段階的にディレクトリを通過し、目的のファイルかディレクトリまでの一連の経路を「/」で繋ぎ合わせてものが<font color="DeepSkyBlue">**絶対パス**</font>です。

それに対し、<font color="IndianRed">**相対パス**</font>は、<font color="indianred">**カレントディレクトリから**</font>の経路を繋ぎ合わせたものです。相対パスでは、現在のディレクトリを「.」、一つ上のディレクトリ(親ディレクトリ)を「..」で表します。

### echoコマンドについて
<font color="red">**echoコマンド**</font>は、コマンドラインに入力した文字列を、画面に出力として表示するためのコマンドです。

使用例はこんな感じ↓
```
hoge@host ~ % echo "Hello World"

# 出力
Hello World
```
「なんの意味が...」と思うかもしれませんが、意外と使うことがあります。

例えば、シェル変数などを展開するのに使えます。
シェル変数とはシェルの中で定める変数のことです。例えば、a=10とするとaという変数は10として扱われます。

以下で実行例を見てみましょう。
```
# シェル変数の定義
hoge@host ~ % a=10

# シェル変数の展開
hoge@host ~ % echo "$a"
#出力
10
```
このように、代入されたものを展開したりできます。
今回は割愛しますが、同じ要領で環境変数の展開もできます($PATHなど)。気になる人は調べてみてください！