Linuxの基礎 2日目

# 2日目

## 1 Linuxの基本操作

### 1-1 Linuxの基本操作

- LinuxユーザーインターフェースにはCUIとGUIがある
  - CUI(Character-based User Interface) or CLI(Command Line Interface)
    - コマンド（文字）操作で行う方式
  - GUI(Graphical User Interface)
    - マウスを使用して、アイコンやメニューなどを視覚的要素で操作を行う方式
- Linuxは基本的にCUI(CLI)で操作する
- GUIの実現にはX Window Systemが使われている。
  - ウィンドウマネージャによって表示されるGUIが異なる
    - GNOME
    - KDE
    - XFCE　など...
  
### 1-2 ログインとログアウト

- Linuxシステムを利用するにはログインする必要がある
    ```
    login
    login [-pq] [-h hostname] [username]
    login -f [-lpq] [-h hostname] [username [prog [arg ...]]]

    
    # -p
    # 環境を保存する。

    # -f
    # ユーザはすでに認証されているものとして、認証動作を行なわない。

    # -h
    # このログインのリモートホストの名前。

    # -r
    # rlogin の自動ログインプロトコルを実行する。

    # -r , -h , -f オプションは、 root(管理者アカウント) が login を起動した場合にのみ用いる。
    ```
- プロンプトはコマンド入力の準備ができていることを示す
    ```
    [user@host ~]$
    ```
- Linuxシステムの利用を終えたらログアウトする
  ```
  exit

  # または、「Ctrl + D」でログアウト可能
  ```

### 1-3 コマンドによる操作

- コマンドを入力してEnterキーを押すとコマンドが実行される
- コマンドに指示する値を引数という
  ```
  cal 2023

  # 「cal」がコマンドであり、「2023」が引数である
  # calコマンドは、カレンダーを表示させるコマンド、表示させる年次を引数(2023)で指定してる
  ```
- オプションはコマンドの動作を調整する
  ```
  cal -m -3

  # オプションは、コマンド動作を調整する役割を果たす
  # 一般的なオプションは1文字で表され、「-」に続けて指定する
  # この場合は、「-m」は週の開始を月曜日に指定するオプションであり、「-3」は現在の月の前後3ヶ月間を表示する

  # コマンドの書式
  # コマンド [オプション] [引数]
  ```

### 1-4 マニュアルを使ってみる

- Linuxにはオンラインマニュアルが用意されている
  - Linuxコマンドには数千のコマンドが用意されており、コマンドのマニュアルが用意されている
- オンラインマニュアルを参照するには「man」コマンドを使う
  ```
  # manコマンドの書式
  # man [セクション] コマンド

  # セクション
  # 設定ファイルの書式、プログラミングに必要な情報など、いくつかのカテゴリーに分かれている。
    オンラインマニュアルのセクションについては、以下の表を参考にする。

  # どのセクションに割り当てられているかわからない場合は、「whatis」コマンドを利用する
  # whatisコマンドの書式
  # whatis コマンド
  ```

  オンラインマニュアルのセクション
  | セクション番号 | 説明 |
  | ---- | ---- |
  | 1 | 一般ユーザーコマンド |
  | 5 | 設定ファイルの書式 |
  | 8 | システム管理コマンド |

- コマンドの簡単な使い方は「--help」オプションで調べることができる
  - コマンドによっては、マニュアルだけでなくヘルプが用意されているものがある
  - ヘルプを表示するには、オプションとして「--help」を指定する
    ```
    # コマンドの書式
    # コマンド --help

    # 全てのコマンドで使用できるわけではないが、少々使い方を確認したいときには便利なオプションである
    ```

### 1-5 システムの終了と再起動

- システムの終了や再起動には「**shutdown**」コマンドを使う
  - shutdownコマンドの主なオプション
    ```
    # コマンドの書式
    # shutdown [オプション] 時間
    ```
    shutdownコマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -r | システム終了後に再起動する(reboot) |
    | -h | システムを終了して停止する(halt) |
    | -c | 実行中のシャットダウンをキャンセルする(cancel) |

  - shutdownコマンド例
    ```
    # 直ちにシステムを停止
    $ shutdown -h now

    # ただちにシステムの再起動
    $ shutdown -r now

    # 10分後にシステムの再起動
    $ shutdown -r +10

    # 22時30分にシステムを再起動
    $ shutdown -r 22:30
    ```
- shutdownコマンドを実行することができるのはrootユーザーだけである

## 2 ファイルとディレクトリ

### 2-1 ファイル

- ファイル名は、大文字と小文字が区別される
  - アルファベット
  - 数字
  - 記号(アンダーバー「_」、ハイフン「-」、ドット「.」)
- ドット「.」で始まる名前のファイルは表示されない
  - ドット「.」で始まるファイルは、「隠しファイル」として扱われ、主に「ユーザー環境」や「アプリケーションの設定ファイル」として使われる。
- ファイルには、「通常ファイル」、「ディレクトリ」、「リンクファイル」、「特殊ファイル」がある
  - 通常ファイル : データやプログラムが格納されたファイルを通常ファイルという
  - ディレクトリ : いわゆるフォルダに相当するものがディレクトリ
  - リンクファイル　: ファイル名とファイルの実態（内容）を紐づけることをリンクという。リンクには、以下の種類がある。
    - シンボリックリンク
    - ハードリンク
- lsコマンドでファイルの一覧を表示できる
  ```
  # コマンドの書式
  # ls [オプション] [ファイル名 or ディレクトリ名]

  # lsコマンドの実行例
  $ ls

  # -lオプションを付けて実行すると、ファイルの属性情報も表示される
  $ ls -l
  ```

  ファイルの種類情報
  | 文字 | 説明 |
  | ---- | ---- |
  | - | 通常ファイル |
  | d | ディレクトリ |
  | l | リンクファイル |
  | c | 特殊ファイル（キャラクタデバイスファイル） |
  | b | 特殊ファイル（ブロックデバイスファイル） |

### 2-2 ディレクトリ

- 全てのディレクトリの頂点となるトップディレクトリを「**/(ルート)**」ディレクトリという
- ファイルやディレクトリの場所を表すパスには、相対パスと絶対パスがある
  - 相対パス
    - カレントディレクトリ(ユーザーが操作を行っているディレクトリ)上で指定可能（省略可能）なパス
      ```
      # 相対パスを使ったファイル指定(コマンドライン上で正しいカレントディレクトリになっていること)
      $ ls -l data/images/cat.jpg

      # カレントディレクトリ確認コマンド
      $ pwd
      ```
  - 絶対パス(フルパス)
    - ルートディレクトリ(トップディレクトリ)を基点としてファイルやディレクトリのパスを表す
      ```
      # 絶対パスを使ったファイル指定
      $ ls -l /home/penguin/data/images/cat.jpg
      ``` 
  - パス記述で使うことのできる記号
    | 記号 | 説明 |
    | ---- | ---- |
    | .(ドット1文字) | カレントディレクトリ(省略可能) |
    | ..(ドット2文字) | 1つ上のディレクトリ |
    | ~(チルダ) | ホームディレクトリ |

- 相対パスはカレントディレクトリを基点に、絶対パスはルートディレクトリを基点とする
- ユーザーごとに「**/home/ユーザー名**」というホームディレクトリが割り当てられる
  - ログインするユーザーことによって、Linuxのユーザーディレクトリが用意されている

### 2-3 ファイルの表示とディレクトリ移動
- テキストファイルの内容は**cat**コマンドで表示できる
  ```
  # コマンドの書式
  $ cat [ファイル名]

  # catコマンドで複数ファイルを表示する書式
  $ cat [ファイル名1] [ファイル名2]
  ```
- 大きなテキストファイル(容量または、膨大なデータ)の内容は**less**コマンドで表示する
  ```
  # コマンドの書式
  $ less [ファイル名]
  ```
  
  lessコマンドの主なキー操作
    | キー操作 | 説明 |
    | ---- | ---- |
    | ↓ | 1行下にスクロールする |
    | ↑ | 1行上にスクロールする |
    | Space | 1画面下方向に進める |
    | Ctrl + B | 1画面上方向に戻す1 |
    | Q | 終了する |

- ***cd***コマンドで別のディレクトリに移動できる
  ```
  # コマンドの書式
  $ cd [-] [移動先ディレクトリ]
  ```

### 2-4 ハードリンクとシンボリックリンク
- ファイルはiノードで管理されており、iノードにはファイルの属性情報が格納されている
  - iノード(index node)
    - 主に、ファイルやディレクトリの属性情報が記載されているデータ(ファイルやディレクトリの所有者や更新日時、ファイルサイズなどの属性情報が記載されているデータ)
      ```
      # iノードの確認コマンド
      $ ls -i
      ```
- ハードリンクを使うと1つのファイルに複数の名前でアクセスできる
  - ハードリンク
    - 1つのiノードに複数ファイル名をリンクさせることを**ハードリンク**という
      ```
      # ハードリンク作成コマンド
      ln [元のファイル] [作成するリンクファイル]
      ```
- シンボリックリンクはファイルに別名を付ける仕組みである
  - シンボリックリンク  
    - ファイルに別名を付ける仕組みのこと。WindowsにおけるショートカットやmacOSにおけるエイリアスと同じようなもの
      ```
      # シンボリックリンク作成コマンド
      ln -s [元のファイル] [作成するリンクファイル]
      ```
- ハードリンクとシンボリックリンクは**ln**コマンドで作成できる
- ハードリンクとシンボリックリンクの違い
  - 元ファイルのハードリンクとシンボリックリンクを作成する
    ```
    # ハードリンク作成コマンド
    $ ln today today.hard

    # シンボリックリンク作成コマンド
    $ ln -s today today.sym

    # iノード確認コマンド
    $ ls -i
    6755399441080787 today   6755399441080787 today.hard  37154696925866027 today.sym

    # 上記のiノードを見ると、ハードリンクはiノードが同じだが、シンボリックリンクはiノードが異なっていることがわかる
    ```

  - 元ファイルを削除する
    ```
    # この状態で、元ファイル(todayファイル)をrm(削除)コマンドで削除する
    $ rm today

    # ハードリンクにアクセスする
    $ cat today.hard
      Tue Aug  1 04:52:42 JST 2023

    # シンボリックリンクにアクセスする
    $ cat today.sym
      cat: today.sym: No such file or directory
    ```
  - 上記の比べてみるように、ハードリンクは直接、iノード事態をコピーしているので、元ファイルが削除されていても、ハードディスク上のポインタ(ファイルの参照先)から呼び出すことが可能

  - 対して、シンボリックリンクはiノードは別になっているので、元ファイルを削除した際にその元ファイルのポインタ(ファイルの参照先)を呼び出しているだけであるので、呼び出し元(元ファイル)がなければ、エラーになる
    - これは、Windowsのショートカットや、macOSのエイリアスと同じ機能である