Linuxについて

# はじめに
**Linux**ってなんなのか
OSの一種
コンピュータを動かすためのソフトでWindows、Mac OS X、AndroidもOSです
サーバー、組み込み、デスクトップ用と幅広い用途で使われている

### 特徴
・オープンソース
・世界中で使われているので信頼性が高い
・品質が高く多くのソフトウェアが使える
・自動化の仕組みによりサーバーの運用がしやすい
など幾つもの特徴があります。

### 欠点
・商用アプリケーション、Microsoft Officeが動作しない
・日本語対応されていない

# Linuxの基礎用語

### カーネル
OSの中核となるソフウトウェアでコンピュータのハードウェア制御などを行う

### ディストリビューション
Linuxを使う上で必要なプログラムをまとめて簡単にインストールできるようにしたもの
1000種類以上ある

### シェルとはなんなのか
LinuxのCLIを提供するソフトウェアでユーザーとカーネルの仲介をしている

### 機能
1. ユーザーがプロンプトにコマンドを打つ
   → 入力されたコマンドを理解し、実行
2. シェルが入力された名前のコマンドを探す
   →　カーネルが見つかったコマンドを実行
3. シェルが結果を画面に表示

### 種類
**sh** 
最も古いシェルでほぼ全てのUnixで利用可能な標準的なシェル
機能は少ない

**bash**
shを基本としており機能を拡張されたシェル
Linux環境でデフォルトのシェル

**zsh**
bashの機能も取り込んでおり、独自の機能も追加されている
機能が豊富

# Linuxのディレクトリ
### ディレクトリの役割
**/bin**
一般ユーザ及び管理ユーザが使用可能なコマンドの実行ファイルを格納
特にLinuxの動作に最低限必要な極めて重要なコマンドを格納している

**/dev**
デバイスファイルを格納している

**/etc**
設定ファイルを格納している
Linuxの自体の設定やLinuxで動作するアプリケーションの設定ファイルなどを格納している

**/home**
ホームディレクトリが配置されている
ユーザーはホームディレクトリ内に自由に作成可能

**/sbin**
管理者ユーザー向けのコマンド実行ファイルを格納している

**/tmp**
一時的なファイルを格納している

**/usr**
各アプリケーションとそれに付随するファイルを格納している

**/var**
変化するデータを格納している
ログを格納

### パス
ディレクトリやファイルの住所情報

**・絶対パス**
「/」ルートディレクトリから始まる確実なパス表記のこと
どのディレクトリにいてもパスを指定できる
例：　「/home/work/README.md」

**・相対パス**
カレントディレクトリ（現在いるディレクトリ）から始まるパス表記のこと
現在いるディレクトリが変わると利用できない（指定ができない）
例:　「../work/README.md」

### 具体的なコマンド
**cd**
ディレクトリに移動するコマンド
「.」カレントディレクトリ（現在自分がいるディレクトリ）
「..」親ディレクトリ（1つ上の階層のディレクトリ）
「~」ホームディレクトリ（「/home/ユーザー名」ディレクトリ）
「/」ルートディレクトリ（「/」ディレクトリ） 

**pwd**
今いるディレクトリを表示するコマンド

**ls**
ファイルやディレクトリの一覧を表示するコマンド
書式：ls[option][file]
*オプションとはハイフンになにかの記号をつける形の引数のこと
| option |  |
| --- | --- |
| -l | ファイルの詳細を表示する |
| -a | 隠しファイルも含めて全て表示する |
| -F | ファイル種別を表示 |

**mkdir**
ディレクトリを作成できるコマンド

| option |  |
| --- | --- |
| -p | 指定されたディレクトリの上位ディレクトリも作成する|

**rmdir**
ディレクトリを削除できるコマンド
**空ディレクトリしか削除できない**。

| option |  |
| --- | --- |
| -p | 指定した階層までのディレクトリを一括で削除する |

# Linuxのファイル操作
### 具体的なコマンド
**cat**
ファイルの中身を表示するコマンド
1画面に表示
| option |  |
| --- | --- |
| -n | 行番号を表示する|

**less**
ファイルの中身をスクロール表示するコマンド
長いファイルを見たい時に使う

・ファイル操作
| command |  |
| --- | --- |
| space or f | 一画面下へスクロール |
| b | 一画面上にスクロール |
| j | 一行下にスクロール |
| k | 一行上にスクロール |
| q | lessコマンドの終了 |

**tail**
ファイルの最後の数行を出力してくれるコマンド
| option |  |
| --- | --- |
| -c | 出力する文字数を指定 |
| -n | 出力する行数を指定 |
| -q | ファイル名を表示しない |
| -v | ファイル名を常に表示 |
| -f | ファイルの追記を監視 |

**touch**
新規の空のファイルを作成するコマンド
上書きしないから安全

**rm**
ファイル・ディレクトリを削除するコマンド
*ゴミ箱に行かずに削除されるから注意
| option |  |
| --- | --- |
| -r | ディレクトリも合わせて削除 |
| -f | 警告文を表示せずに削除 |
| -i | ファイル削除前に確認 |

**mv**
ファイルの場所移動・ファイル名を変更する。
| option |  |
| --- | --- |
| -i | 上書きする前に確認 |
| -r | 強制実行 |

**cp**
ファイル・ディレクトリをコピーするコマンド
| option |  |
| --- | --- |
| -i | 上書きする前に確認 |
| -r | ディレクトリをコピーする |

**ln**
長いパス名を省略したい時に使うコマンド
ファイルに別名をつけることを**リンクを貼る**という
・ハードリンク
1つのファイルの実態に複数の名前をつける
元のファイルを削除しても消えない
・シンボリックリンク
リンク先のパス名が書かれたファイル（ショートカットのようなもの）
ファイルの実体を削除したり、移動するともちろん参照できなくなる

| option |  |
| --- | --- |
| -s | シンボリックリンクを貼る |

オプションをつけないとハードリンクになる

**find**
ファイルを検索するコマンド
| option |  |
| --- | --- |
| -name | ファイル名を指定して検索（大文字小文字は区別する） |
| -iname | ファイル名を指定して検索（大文字小文字は区別しない）|
| -type | ファイルの種類で検索|
| -a | 複数の検索条件を指定（-aは省略可能）|

# 標準入出力
プログラムが特に何も指定されていない場合に利用するデータの標準的な入出力元
・標準入力
キーボードが通常使われる
・標準出力
ディスプレイが通常使われる
・標準エラー出力
エラーメッセージを出力
ディスプレイが通常使われる

### リダイレクト
入出力先を変更する機能
出力とエラー出力は別

OSが識別するために用いる識別子
| 入出力 | 数値 |
| --- | --- |
| 標準入力 | 0 |
| 標準出力 | 1 |
| 標準エラー出力入力 | 2 |

・出力とエラー入力をまとめる
2>&1

・リダイレクトで追記
大なり　（>）を用います。
ファイルに追記したい場合はアペンド (>>)を用います。

**パイプライン**
複数のコマンドを連携させる機能
コマンドの標準出力を別のコマンドの標準入力に繋げる

```bash
$ ls /bin | less
```
パイプラインで繋げてスクロール表示できるようにする

**grep**
ファイルの中からデータを検索
| grep
とすることで入力されたデータに対して検索を行うことが可能

# パーミッション
ファイルやディレクトリを「だれがどのように操作可能なのか」を決めているもの

ファイルにはオーナーとグループが設定されている
・オーナー：ファイルの所有者
・グループ：ユーザーをグループに所属させてグループに権限を与える

ls -l コマンドでファイルのオーナーとグループが確認可能

**chmod**
ファイルやディレクトリのパーミッションを設定するコマンド
ファイルのモードとして【読み込み・書き込み・実行】の３つの権限がある

**chown**
ファイルの所有者を変更するコマンド

**sudo**
管理者権限を持つ特別なユーザー
ルートユーザー
コマンドの前につけると実行できる

# プロセス
実行中のプログラムのこと
コマンドを1つ実行すると新しいプロセスが1つ生成される
OS全体で統一して管理される

**ps**
実行中のプロセスを表示するコマンド

| option |  |
| --- | --- |
| aux | 全ユーザーのプロセスを表示 |

*オプションだけど - をつけなくてよい


**ジョブ**
まとめて実行されるプロセスの集まりのこと
シェルごとに管理される

**kill**
ジョブやプロセスを終了させるコマンド
シグナルを送信するコマンド

# さいごに
ここにまとめたのは基本のコマンドについてです。
教科書でのinputも必要ですが、普段からターミナルを使ったりLinuxの試験をうけることでより深掘りできると思います。

https://linuc.org/textbooks/linux/