Linuxのコマンド操作でよく見かける記号の意味を知りたい！

# この記事を書いたきっかけ
Linuxのコマンドの勉強をしていると、よく見かける記号がいくつかあることに気づきました。例えば、|（パイプ）や >（リダイレクト）は、Webアプリケーション開発で使用するコマンドによく出てきます。

しかし、コマンドは覚えていても、その記号がどういうときに使われるもので、どのような意味を持っているのかに注目したことはありませんでした。正直、ひとつひとつの記号の意味を調べることは後回しにしていました。

ただ、日常的に使う可能性のある記号はある程度知っておきたいと思い、今回まとめてみました。技術書を読んで知らない記号に出会っても、怖い思いをしないように（？）先に覚えてしまいましょう。

# 記号の使い方ガイド
## 1. ディレクトリを操作するときによく使う記号
**ディレクトリ（パス）を表す記号**
| 記号 | 意味 |
|:-|:-|
|  ~ (チルダ) |  ホームディレクトリ |
|  - (ハイフン) |  直前にいたディレクトリ |
|.(ドット)|カレントディレクトリ|
|..(ドットドット)|ひとつ上のディレクトリ|

### ~ (チルダ) 
ホームディレクトリ
チルダはシェルがホームディレクトリに展開する特殊な文字
```
$ cd ~
$ pwd
/home/username
```
### - (ハイフン)
直前にいたディレクトリ
ただし、cdやpushdコマンドに限定されます。
```
$ cd /var/log
$ cd /etc
$ cd -
/var/log

$ pwd
/var/log
```
### . (ドット)
カレントディレクトリ
これらはシェルやコマンドに関係なく、常に現在のディレクトリを指します。
```
$ pwd
/home/username

$ ls .
Desktop  Documents  Downloads  Music  Pictures  Videos
```
### . (ドットドット)
ひとつ上のディレクトリ
これらはシェルやコマンドに関係なく、常に現在のディレクトリと一つ上のディレクトリを指します。
```
$ pwd
/home/username/projects/myproject

$ cd ..
$ pwd
/home/username/projects
```

# 2. ファイル名を検索したいときによく使う記号
## ワイルドカード
ワイルドカードとは、シェルの機能で複数の文字に合致する特殊文字のことを指します。ワイルドカードを使うと、一定のパターンにそったファイル名やディレクトリ名を指定できます。

|記号	|意味|	例|	
|:-:|:-|:-|
|∗|	0文字以上の任意の文字列|*.txt |
|?	|任意の1文字をあらわす|	hello?.txt	|
|[ ]|	角カッコ内の任意の文字。ハイフンで範囲を指定できる|	[0-9][a-zA-Z]	|
|[^]|否定を表す。その後ろの文字の並び以外を指定する|[^0-9]|

### ∗（アスタリスク）
0文字以上の任意の文字列に一致します
```
$ ls *.txt
file1.txt file2.txt document.txt
```
### ?（クエスチョンマーク）

任意の1文字に一致します
```
$ ls hello?.txt
hello1.txt helloA.txt
```
### [ ]（角カッコ）

角カッコ内の任意の1文字に一致します。範囲を指定する場合はハイフンを使用します。
```
$ ls file[1-3].txt
file1.txt file2.txt file3.txt
```
### [^ ]（キャレットと角カッコ）

角カッコ内の文字を除外します。キャレット（^）は否定を表します。
```
$ ls [^a-z]*
123.txt Hello.txt
```
# 3. ファイル名を一度に指定したいときに使う記号
## ブレース展開
ブレース展開は、シェルで複数のパターンを簡単に指定するための機能です。ブレース展開を使用すると、特定の文字列の組み合わせを一度に生成することができます。コマンドの入力を簡単にすることができます。
### { }（波カッコ）
| 記号 | 意味 |実例|
|:-:|:-|:-|
|  {a,b} |  カンマで区切られた複数のパターンを展開 |echo {a,b} -> a b|
|  {1..3} | 数値の範囲を展開  |echo {1..3} -> 1 2 3|
|{a..c}|文字の範囲を展開|echo {a..c} -> a b c|
|{a,b}{1,2}|組み合わせて展開|echo {a,b}{1,2} -> a1 a2 b1 b2|
	
**実例**
ファイルの一括作成
```
$ touch file{1..3}.txt
$ ls
file1.txt file2.txt file3.txt
```

複数のディレクトリを一括作成
```
$ mkdir -p project/{src,bin,lib}
$ ls project
bin lib src
```
複数のファイルパスの一括操作
```
$ cp ~/Documents/{file1.txt,file2.txt} ~/Backup/
```
**注意点**
ブレース展開は、実在するファイルとは無関係に文字列を展開します。ワイルドカードとは異なります。
		

# 4. Webサーバーを操作するときによく使う記号
**リダイレクトとパイプ**
| 記号 | 意味 |
|:-|:-|
| >  | 標準出力をファイルに上書き  |
| >>  | 標準出力をファイルに追記する  |
|<|ファイルから標準入力にリダイレクトする|
|｜|標準出力を次のコマンドの標準入力に渡す|

### 標準入出力
Unix系OSやLinuxでは、プログラムがデータをやり取りするための基本的な「口」として、「標準入出力」というものが定義されています。
- 標準入力（Standard Input, stdin）
    - プログラムが入力データを受け取るための「口」です。
    - デフォルトでは、キーボードからの入力を受け取ります。
- 標準出力（Standard Output, stdout）
    - プログラムが出力データを送り出すための「口」です。
    - デフォルトでは、ターミナル（画面）に出力されます。
- 標準エラー出力（Standard Error, stderr）
    - プログラムがエラーや警告メッセージを出力するための「口」です。
    - デフォルトでは、標準出力と同じくターミナル（画面）に出力されますが、標準出力とは別の独立した「口」として扱われます。

標準入力/出力/エラーを洗濯機の給水口・排水口に例えるとわかりやすいです。プログラム自体は洗濯機であり、給水口（標準入力）から水を受け取り、排水口（標準出力）から水を排出します。エラー用の排水口（標準エラー出力）もあります。リダイレクトやパイプは、これらの接続先を変えるホースのようなもので、入力や出力を別のファイルやデバイスに切り替えます。

プログラム目線（洗濯機）で考えて、標準入力（給水口）からどんな手段で入力（水）を受け取り、どんな手段で標準出力（排水口）に出力（排水）するか、というように考えます。
***

### リダイレクトとは
リダイレクトは、これらの標準入出力の「口」をデフォルトの接続先（キーボードやターミナル）から別のファイルやデバイスに**変更**するための機能です。

### >（リダイレクト）
標準出力をファイルにリダイレクトします。その結果、コマンドの出力結果をファイルに保存することができます。デフォルトでは、標準出力はターミナルに表示されますが、リダイレクトを使うことで出力先を変更できます。ファイルが存在しない場合、新しいファイルが作成されます。


`[コマンド] > [ファイルパス]`

**使用場面**
ls -l コマンドの出力を directory_list.txt ファイルに保存します。後でディレクトリの内容を確認したい場合に便利です。
```
$ ls -l > directory_list.txt
```

**使用場面**
pip freezeをリダイレクト（>）でファイルに出力し、
`pip install -r requirements.txt`コマンドを実行することで、
そのファイル（requirements.txt）を使って元の環境と同じバージョンのパッケージを別環境に一括でインストールできます。
```
$ pip freeze > requirements.txt
```
***
### >>（追記リダイレクト）
標準出力をファイルにリダイレクトする記号です。既存のファイルにデータを**追加**したい場合は、>> を使います。これにより、既存の内容を保持したまま新しいデータをファイルに追加できます。
`[コマンド] >> [ファイルパス]`
```
$ ./deploy.sh >> deploy.log 2>> error.log
```
**使用場面** 
デプロイスクリプトの出力を deploy.log に追記し、エラー出力を error.log に追記します。
***
### <（リダイレクト）
標準入力をファイルからリダイレクトすることで、プログラムが入力としてファイルの内容を読み取ることができます。通常、標準入力はキーボードからの入力を受け取りますが、リダイレクトを使うことでファイルからデータを読み取ることができます。

`[コマンド] < [ファイルパス]`
```
$ sort < names.txt
```
**使用場面**
names.txtファイルの内容がsortコマンドに入力されます。
```
$ mysql -u user -p database < script.sql
```
**使用場面**
script.sql ファイルに記述されたSQLコマンドをMySQLデータベースに適用します。


**キーボードの代わりにファイルからデータを読み込むことができます！**
***
### |（パイプ）
パイプは、あるプログラムの標準出力を別のプログラムの標準入力として接続するための機能です。これにより、複数のコマンドを連鎖させて処理を行うことができます。

上記の洗濯機の例を用いると、プログラム（洗濯機）の標準出力（排水）されたものを、別のプログラム（洗濯機）の標準入力（給水）として接続するしたいときに、そのつなぎとなってくれるものを文字通りパイプといいます。
`[コマンド1] | [コマンド2]`
```
$ grep "ERROR" application.log | less
```
**使用場面**
ここでは、application.log ファイルから "ERROR" を含む行を抽出し、less コマンドでページング表示しています。

# まとめ
ディレクトリ操作、ファイル名検索、Web開発など、日常的にコマンド操作を行う場面でよく見かける記号をまとめてみました。Linuxで使用されている記号はもっとたくさんありますが、今回は最低限覚えておきたいものだけを列挙しました。

これらの記号を自由自在に活用できれば、効率的に自分の希望通りのコマンド操作をすることができます。この記事を何度も見返して、うまくコマンドを使えるようになりたいです。