「新しいLinuxの教科書 第2版」まとめ

# はじめに
- YUZURIHAの松村です。
- 今回も書籍のまとめになります。
- [新しいLinuxの教科書](https://www.sbcr.jp/product/4797380941/)の[第2版](https://www.sbcr.jp/product/4815624316/)が出版されたので、購入しました。
- 本書は基礎的な内容ではありますが、復習の意味も込めてまとめを書くことにしました。
- なお、今回も購入には[miive](https://miive.jp)という弊社で導入している福利厚生サービスを活用しています。

# miiveとは
- miiveとはプリペイド式のクレジットカードで、「食事」または「学び」に使用できるポイントが毎月3,500円分支給されます。
- 私は主に書籍の購入で活用していますが、毎月書籍購入で3,500円分の補助があるのは本当にありがたいです！
- 弊社でのmiive導入については[こちら](https://miive.jp/case-study/yuzuriha)で詳しく紹介しているので、興味のある方は是非ご覧ください。

# Chapter 01. Linuxを使ってみよう
- 本章では、仮想化ソフトウェアである`Oracle VM VirtualBox`を使って、Linux環境を用意する方法について説明してくれています。
- ログイン・ログアウト・シャットダウンといった基本的な操作についても解説してくれています。

# Chapter 02. シェルって何だろう？
- 以下6種類のシェルについて紹介されています。
  - sh
  - csh
  - bash
  - tcsh
  - zsh
  - fish
- この中でも、本章ではbashを使うことを強く推奨しています。その理由は以下の通りです。
  - > Linuxでデフォルトのログインシェルとして採用されており、利用する機会が多い
  - > 対話的に使うにも、シェルスクリプトを利用するにも、ともに十分な機能を持っている
  - > shとの後方互換性を保つため、既存のsh用のシェルスクリプトをそのまま利用できる
  - > Linux以外にも、FreeBSD/Solarisなど多くの環境に移植されている
  - > 利用者が多く、書籍やWebからの情報を集めやすい

# Chapter 03. シェルの便利な機能
- シェルからコマンドを入力するにあたっての便利な機能を紹介してくれています。
- カーソル移動・文字の削除・補完機能・コマンド履歴の検索という基礎的な内容ですが、しっかり使いこなせるのと使いこなせないのとでは作業効率はかなり変わってくると思うので、重要ですね。

# Chapter 04. ファイルとディレクトリ
- Linuxのファイル構成について解説されています。
- 以下3つのコマンドを駆使しながらディレクトリを探索して、どのディレクトリにどんなファイルがあるかを確認して行ってます。
  - pwd
  - cd
  - ls
- 本章も基礎的ではありますが、とても重要な内容になっています。

# Chapter 05. ファイル操作の基本
- 本章も基礎的なコマンドの紹介になります。
- 紹介されているコマンドは、以下の9つです。
- mkdir
  - ディレクトリを作成する
- touch
  - ファイルを作成する
- rm
  - ファイルを削除する
- rmdir
  - ディレクトリを削除する
- cat
  - ファイルを表示する
- less
  - スクロール表示する
- cp
  - ファイル・ディレクトリをコピーする
- mv
  - ファイルを移動する
- ln
  - リンクを張る

# Chapter 06. 探す、調べる
- ファイルやディレクトリを探すためのコマンドや、コマンドの利用方法を調べる方法について解説されています。
- find
  - ディレクトリツリーからファイルを探す
- locate
  - ファイル名データベースからファイルを探す
- man
  - マニュアルを表示する
- which
  - コマンドを探す

# Chapter 07. テキストエディタ
- 本章は、ほとんどのLinuxディストリビューションに標準でインストールされているVimについての紹介になります。
- `:q`や`:w`・`h`・`j`といったVimの基本的なコマンドについて解説されています。
- また、Vimの操作を学べるチュートリアル`vimtutor`も紹介されており、面白そうだなと思いました。

# Chapter 08. bashの設定
- 本章では、シェルを便利に使うための様々な設定について解説されています。
## エイリアス
- コマンドにエイリアスを張ることができる`alias`というコマンドがある。
## bashのオプション
- bashの様々なオプションの有効化・無効化を切り替えるコマンドとして、`set`コマンドと`shopt`コマンドがある。
- `set`指定できるオプションと`shopt`で指定できるオプションは異なる。
### `set`コマンドのオプション(抜粋)
- ignoreeof
  - Ctrl + Dを押してもシェルを終了しない。
- noclobber
  - 既に存在巣ファイルをリダイレクトで上書きしない。
- noglob
  - パス名展開を無効にする。\*などはシェルに解釈されず、そのまま\*となる。
### `shopt`コマンドのオプション(抜粋)
- autocd
  - ディレクトリ名のコマンドを実行すると、それがcdコマンドの引数に指定されたものとして実行される。
- dotglob
  - \*や\?を使ったパス名展開の結果に、\.で始まるファイルも含める。
- cdspell
  - cdコマンド実行時、ディレクトリのちょっとしたタイプミスが自動修正される。
## bashの設定ファイル
- bashの起動時に読み込まれる設定ファイルとしては、`/etc/profile`・`~/.bash_profile`・`~/.bashrc`がある。

# Chapter 09. ファイルパーミッション、スーパーユーザ
- ファイルを操作する権限のパーミッションと、管理者権限をもつスーパーユーザについて解説されています。
## グループ
- ユーザをまとめた集まりをグループという。
- `group`コマンドで、現在自分が所属しているグループを確認することができる。
## `su`コマンドと`sudo`コマンド
- `su`コマンドは、`exit`コマンドで明示的に終了するまで、スーパーユーザ権限が継続する。
- `sudo`コマンドは、1つのコマンドだけをスーパーユーザ権限で実行する。
- スーパーユーザでの操作は、システムに必須なファイルを削除してしまうなど小さなミスが致命的な問題を引き起こす可能性があるため、現在では`su`コマンドよりも`sudo`コマンドの方がよく使われる。

# Chapter 10. プロセスとジョブ
- 複数のプログラムを同時に並列実行できるマルチタスクの機能、プロセスとジョブについて解説されています。
## プロセスとは
- メモリ上で実行状態にあるプログラムのこと
- Linuxカーネルから見た処理の単位
## ジョブとは
- シェルから見た処理の単位
- コマンドが1つの場合は、プロセスとジョブは同じ単位になる
- コマンドをパイプで繋いだ場合は、プロセスはコマンドごとに生成されるのに対して、ジョブはコマンドライン全体で1つになる

# Chapter 11. 標準入出力とパイプライン
- 本章もLinuxの非常に基礎的な部分ではありますが、極めて重要な内容です。
- 復習になった箇所をまとめておきます。
## 標準入力(stdin)
- プログラムの標準的な入力。キーボードが使われる。
## 標準出力(stdout)
- システムの標準的な出力。端末ディスプレイが使われる。
## 標準エラー出力(stderr)
- プログラムのエラーメッセージを出力するための標準的な出力。端末ディスプレイが使われる。
## リダイレクト
- 標準入出力先を変更する機能のこと。
### 入力リダイレクト
- 標準入力をキーボードから`/etc/crontab`ファイルに変更して、`cat`コマンドを実行する
```bash
cat < /etc/crontab
```
### 出力リダイレクト
- コマンドの実行結果を画面に表示するのではなく、ファイルに保存する。
- `ls`コマンドの実行結果を`list.txt`というファイルに保存する。
```bash
ls -al / > list.txt
```
### /dev/null
- `/dev/null`はスペシャルファイルと呼ばれる特別なファイルで、以下のような性質がある。
  - 入力元として指定しても、何も内容を返さない。
  - 出力先と指定しても、書き込んだデータは保存されずに消える。
## パイプライン
- コマンドの標準出力を別のコマンドの標準入力に繋ぐ機能。
- `ls`コマンドの結果を`less`コマンドに送る
```bash
ls -al / | less
```

# Chapter 12. テキスト処理
- 本章では、Linuxでテキストを扱う際によく使われる基本的なコマンドが紹介されています。
- wc
  - 行数・バイト数・単語数を数える
- sort
  - 行を並べ替える
- uniq
  - 重複業を取り除く
- cut
  - 入力の一部を切り出す
- tr
  - 文字を置換する
- tal
  - ファイルの末尾を表示する
- diff
  - 2つのファイルの差分を表示する

# Chapter 13. 正規表現
- `grep`コマンドによる正規表現の使い方について、解説されています。
- 正規表現を自分でしっかり書く機会が少なく、すぐに忘れてしまうのですが読むと勉強になりました。

# Chapter 14. 高度なテキスト処理
- テキスト編集でよく使われる`sed`コマンドと`awk`コマンドについて解説されています。
## `sed`コマンド
- `sed`とは「Stream Editor」の略で、その名の通りエディタである。
- 「Chapter 07. テキストエディタ」で登場した`Vim`は対話型エディタだが、`sed`は非対話型エディタである。

## `awk`コマンド
- テキストの検索や抽出・加工などの編集操作を行うコマンド。
- 非常に高機能なため、一種のプログラミング言語とも言える。

# Chapter 15. シェルスクリプトを書こう
- 「Chapter 15」 ~ 「Chapter 17」はシェルスクリプトについての解説になるため、まず本章では「シェルスクリプトとは何か？」から説明してくれています。
## シェルスクリプトとは？
- シェルのコマンドラインを予め記述しておくファイルのこと。
- 単にコマンドを並べられるだけでなく、条件分岐や繰り返しを利用した複雑な制御構造も記述できる。
## シバン
- シェルスクリプトファイルの`#!`から始まる1行目のこと。
- 1行目に`#!/bin/bash`と書くと、「このシェルスクリプト/bin/bashで動かします」という宣言をすることになる。

# Chapter 16. シェルスクリプトの基礎知識
- 本章では、シェルの文法の基礎知識について紹介されています。
- 変数、クォーティング、コマンド置換、位置パラメータ、制御構造、シェル関数といった内容になります。
- 他のプログラミング言語にも共通する部分が多いので、わかりやすかったです。

# Chapter 17. シェルスクリプトを活用しよう
- 本章では、3つの演習を通してサンプルを作りながらシェルスクリプトについて学んで行きます。
- こういう実践型の演習もあるのが本書の良いところですね。

# Chapter 18. アーカイブと圧縮
- 本章ではファイルをまとめるアーカイブ処理と、ファイルサイズを小さくする圧縮処理について解説されています。
## `tar`コマンド
- 複数のファイルやディレクトリを1つのアーカイブファイルにまとめたり、逆にアーカイブファイルから元のファイルを取り出すために利用する。
## `gzip`コマンド
- ファイルの圧縮・展開を行うためのコマンド。
- ファイルをアーカイブする機能はないので、複数ファイルを1つにまとめてから圧縮するには`tar`コマンドでアーカイブしてから`gzip`コマンドで圧縮する。
## `bzip2`コマンド
- ファイルの圧縮・展開を行うためのコマンドだが、`gzip`コマンドよりも圧縮率が高くデータ量をより小さくできる。
## `zip`コマンド
- アーカイブと圧縮を同時に行うコマンド。

# Chapter 19. バージョン管理システム
- 本章では、バージョン管理システムのGitについて紹介されています。
- 個人的にGitは普段からよく使っているので、頭に入って来やすかったです。

# Chapter 20. ソフトウェアパッケージ
- 本章では、Linuxのパッケージ管理システムについて解説されています。
## `dnf`コマンド(CentOS Stream)
- CentOS StreamなどのRed Hat系Linuxディストリビューションでは、`rpm`というパッケージファイル形式が採用されている。
- `rpm`コマンドは単純な操作しかできず不便なので、`rpm`コマンドをラップしてより高機能な仕組みを提供するのが、`dnf`コマンドである。

※ 初版では`dnf`コマンドではなく`yum`コマンドについて解説されていたので、ここが初版と第2版で一番変わった箇所かもしれません。

## `apt`コマンド(Ubuntu)
- Advance Packaging Toolの略。
- UbuntuなどのDebian系Linuxディストリビューションでは、`deb`というパッケージファイル形式が採用されている。
- `deb`ファイルは`dpkg`コマンドでインストールが行えるが、`dpkg`コマンドを直接使うことは現在では少なく、より高機能な`apt`コマンドが利用される。

# 最後に
- 正直に言うと本書を選ぶ際に「基礎的な内容すぎて今読んでも意味あるかな」と少し思ったのですが、結果としては読んでみてすごく良かったなと思います。
- 久しく使っていないコマンドは完全に忘れていたり、普段使っているコマンドでも知らない(使ったことがない)オプションがあったり、コマンド名の由来を初めて知るものもありました。
- また、仕組みや背景から丁寧に解説してくれているので「ずっと何となく使ってたけどこんな仕組みで動いていたのか」という気付きもありました。
- 「自分は初心者じゃないからいいや」と避けるのではなく、初心者向けで基礎的な内容であったとしても、まずはしっかり読んでみることが大切ですね。
- [世界一流エンジニアの思考法](https://books.bunshun.jp/ud/book/num/9784163917689)の著者である牛尾剛さんも、以下のように仰っていたのを思い出しました。
  - > 「簡単だ」と馬鹿にせず、本当に１からやり直してみた。すると、自分が「ふわっと」わかっているけど、「ちゃんと」理解していなかったり「即座にコーディングできない」ことがたくさん見つかってきた。
  - > 誰でも知っていて、実際にじっくりと時間をかければ誰でもできる「基礎」をちゃんと出来ている人というのは少ないのではないだろうか？もしかすると、これが自分が長年探し続けている「出来ない感」の解決の最後のピースではないだろうか。
  - 引用元
    - https://note.com/simplearchitect/n/n4a8142fedd32