改めてLinuxコマンドを理解する[cat, touch, echo編]

## はじめに
初めまして！ITスクールRareTECHにてCS（Customer Support）を担当している池村です!
やはりシェルは美しいと感じている今日この頃です。

今回はLinuxコマンドの`cat` `touch` `echo`について記事を作成しました。

※この記事は超初学者向けになります。順番的には以下の記事を先に見ていただけると嬉しいです。

https://qiita.com/ikemura-ren/items/0925e9fe2e5cd0b47e01?2

https://qiita.com/ikemura-ren/items/c139204eaf66540cd4af?1

## `cat`コマンド
まずは`cat`コマンドからご紹介します。
`cat`コマンドを簡単に説明すると、ファイルの中身を表示してくれるコマンドです。これもよく使うコマンドになります。

#### 基本的な使い方
使い方は簡単です。
```Bash:書き方
cat ファイル名
```
私は今回、適当に作ったPython（Flask）のコードを表示してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f737174e-0402-d350-bf7f-2634461a19d8.png)

画面に表示されましたね。
`cat`コマンドは基本的にこれだけできれば良いと考えています。

ただ一応、応用方法も書いておきます。
#### 複数ファイルの結合
`cat`コマンドで複数のファイルを指定すると、その中身をくっつけてくれます。
```Bash:書き方
cat ファイル名 ファイル名
```
私の環境ではこうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/7f424faa-20b2-93bf-bd0f-5365ecf93a40.png)
先ほどの`test.py`ともう一つ準備していた`test.py2`を指定してみました。中身がくっついていますね。ファイルの中身が書き換わったわけではなく、表示された内容だけが結合しています。

どこで使うの？と言われましたら、私はパッと思いつかないですね。
おそらく`grep`コマンド（テキスト内から確認したい文字列が含まれている箇所を抜き出すコマンド）と併用して、特定の文字列だけ抜き取るような使い方でしょうか？あとはログファイルの中身を結合して一気に見たい時とかですかね？インフラエンジニアや保守運用している人が使ってそうですね。（予想です）

```Bash:書き方
cat test1.log test2.log | grep "error"
```
のような使い方をすると、ログファイルの中のエラー部分だけ確認できそうです。

## `touch`コマンド
次に`touch`コマンドを紹介します。
`touch`コマンドはファイルを作成するコマンドです。一応ファイルのタイムスタンプの変更ということもできますが、主要なのはファイルを作る方だと考えています。

#### 基本的な使い方
こちらも使い方は簡単です。
```Bash:書き方
touch 自由なファイル名
touch test.txt
touch test.py
touch test.go
```
とかですね。
ちなみにまとめて作成することも可能です。
```Bash:書き方
touch test.txt test.py test.go
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e116eb04-27f3-86c5-99a9-261cae56a51b.png)

ちなみに、作られているのは空のファイルになります。

#### タイムスタンプの変更
すでにあるファイルを指定して`touch`コマンドを使用すると、タイムスタンプを変更することができます。そもそもタイムスタンプっていうのがなんなのか？というお話しですが、ファイルにはアクセス時刻や更新時刻などの情報が入っています。その時間を変更することができるということです。

:::note warn
補足ですが、ファイルの作成日時を変えることはできないです。
:::

```Bash:書き方
touch タイムスタンプを変更したいファイル
```
上記のようにすると、ファイルのアクセス時刻と更新時刻がコマンドを実行した現在時刻に変更されます。以下の画像は`ls -l`の実行結果です。これは更新時間だけですが、変更されているのがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/91ed04df-71c1-cf60-6577-64259d325be4.png)

アクセス時刻、更新時刻、変更時刻の全てを確認するには`stat`コマンドを使えば確認することができます。ここでこのコマンドを詳しく説明はしませんが、使ってみても良いでしょう。
```Bash:書き方
stat ファイル名
```

#### touchコマンドについての補足
タイムスタンプの変更についてはログファイルやバックアップファイルあたりで使いそうですね。
IT業界ではサーバーのログを残す慣習があります。エラー情報やら大事なログがたくさんありますからね。貴重な情報です。あとは様々なデータのファイルをバックアップするためにコピーしたりもします。それらのタイムスタンプを合わせてセットにして保存しておけると迷わなくて良さそうです。

`touch`コマンドのオプション
| オプション           | 説明                                               |
|-----------------------|----------------------------------------------------|
| `-a`                 | アクセス時刻だけを更新する                           |
| `-m`                 | 変更時刻だけを更新する                               |
| `-c` または `--no-create` | ファイルが存在しない場合、新しいファイルを作成しない |
| `-r`                 | 参照ファイルのタイムスタンプをコピーして適用する       |
| `-t`                 | 手動で指定したタイムスタンプを適用する                |
| `--date="日時"`       | 指定した日付を用いてタイムスタンプを更新（`-t` の代わり）。|

オプションに関しては初学者のうちは覚える必要がほぼないですが、一応掲載しておきます。



## `echo`コマンド
では最後に`echo`コマンドをご紹介します。
こちらのコマンドは、画面に文字列を表示させるものです。
プログラミングを学び始めた方々は少しわかると思いますが、大体`print`とか`Println`とかを使って画面に`Hello World`と表示するのがファーストステップだと思います。
要はこれと一緒で、画面に文字列を表示する時に、Linuxでは`echo`コマンドを使います。

#### 基本的な使い方
```Bash:書き方
echo 'Hello World!'
```
これでシェル画面上に`Hello World!`と表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/5469ed05-c130-6b70-44b2-68455fbf10d0.png)

これ自体はそれほど難しくないですね。

では応用を見ていきましょう。
`echo`コマンドはリダイレクトという仕組みを使うことで本領を発揮します。

```Bash:書き方
echo 'Hello World!' > test.txt
```

こう書くことで、文字列`Hello World!`とtest.txtに書き込むことができます。
もしこの`test.txt`が今いるディレクトリに存在しない場合は、勝手に作ってくれます。
ここで一点注意点ですが、`>`を使ったリダイレクトは、ファイルの中身を上書きします。

上書きせずにファイル内の末尾に追記したいときは以下の書き方をします。
```Bash:書き方
echo 'Hello World!' >> test.txt
```

この書き方を行うことで、ファイルの末尾（最後の行）に記述をすることができます。
以下の画像は、`>`と`>>`のリダイレクトの違いによってファイルの中身がどうなっているかを、実際にコマンドを叩いて試したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/b4844258-f3d0-64f1-afce-c1cd8e9c6cf5.png)

リダイレクトはLinuxにおける標準入出力、標準エラー出力などの少し難しい要素が入ってきます。ですがこの記事ではその辺りの難しい要素を省いて、まずはこの二つのリダイレクトがどんな動きをするか紹介しています。

#### よく使われるリダイレクト
こちらの記事でも紹介しましたが、設定ファイルというファイルに様々な設定を書き込むことによって、シェルは使いやすさを増します。

https://qiita.com/ikemura-ren/items/c139204eaf66540cd4af


`echo`とリダイレクトはそれらのファイルに設定を書き込む時によく使われます。
ただ、ここでかなり注意する必要があるのが`>`で設定ファイルに書き込むように記述がされている技術記事です。

例えば以下の書き方です。
```Bash:書き方
echo 'export PYENV_ROOT="$HOME/.pyenv"' > ~/.zshrc
```
これはpyenvというツールを使えるようにする設定を`.zshrc`に書き込んでいる記述です。
上記の`>`を使っている書き方だと、設定ファイルの中身が全て消えて、今書き込んだ設定しかなくなります。

:::note warn
せっかく色々な記述をしてシェルを使いやすくしても、このコマンド一発で中身全てが消えてしまします。
:::

ですので、`echo`でリダイレクトするときは注意して実行しましょう。技術記事をしっかり見て、本当に大丈夫かどうか見極められるようになるとgoodです。設定ファイルに書き込む系のリダイレクトは100%`>>`だと思ってもらっても良いです。

## `cat`コマンドの代替えコマンドについて
#### `bat`コマンド
これは`cat`コマンドを拡張したようなコマンドです。

https://github.com/sharkdp/bat/tree/master

`cat`コマンドは基本的に画面に表示した文字列に色などはつきませんが、batコマンドはコードなどが見やすくなるように色をつけてくれます。以下のような表示ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/d7de611c-b5d8-deaf-8b39-036e2b5112b3.png)

ほぼ上位互換的なコマンドなのでご自身のPCに入れることはオススメできます。
```Bash:Macの場合
brew install bat
```

```Bash:Ubuntuの場合
sudo apt update
sudo apt install bat
```

```Bash:実行方法
bat ファイル名
```

コードを表示するときはこちらのコマンドの方が見やすいですね。
ゆっくり見るならエディタを開けというツッコミはスルーしますが。


## おわりに
今回はLinuxコマンドの基本③として解説いたしました。
これらのコマンドはよく使う上位のコマンドです。初学者は今回紹介した使い方だけでもマスターして欲しいと思っています。

次回はディレクトリの作成や、それらの削除についてまとめていく予定です。
簡単な記事は書きやすいけど、自分の知識習得にはあまり効果がない気もするので、同時並行でDocker周りの記事も書いていく予定です。

また読んでくれたら嬉しいです。ここまで読んでいただき、ありがとうございました。
次の記事はこちら👇

https://qiita.com/ikemura-ren/items/4dc96ea729a4197fd09d?1

まとめ記事はこちら👇

https://qiita.com/ikemura-ren/items/3e7b6ec1b0cd9b3928d6