Linuxをこれから触る人へ(Linuxの基本操作)

# Linuxの基本操作

対象はLinux触ったことがないプログラマー向け
コマンドラインの見方や基本的なコマンドいくつか挙げています。
また、エディタVimの基本操作もまとめています。

### 1. 知識や用語

#### ***ユーザーインターフェイス〜GUIとCLI(CUI)について〜***
- GUI(Graphical User Interface)…普段使用しているマウス等で操作できるインターフェース。
- CLI(Command-line Interface)、CUI(Character User Interface)…操作はキーボードのみで行うインターフェース。

#### ***Linuxコマンドについて***
- Linuxコマンドは次のように使用する。
<br>※ここではスペースをアンダースコア「_」で表記している)

```sh
$ Command_(オプション)_([ファイル名などの指定①])_([ファイル名などの指定②])
```

#### ***ディレクトリについて***
- ディレクトリは「/」で区切る。左から順番に階層を表す。
  - 下記例を参考に、homeが一番上の階層、homeの直下にuser、userの直下にtestが存在していることを表す。
```
/home/user/test/
```
- **ディレクトリを表す記号**「.」「..」「~」
  - カレントディレクトリ(現在位置、今いるディレクトリ)は「./」(ドットとスラッシュ)で表す。次の階層を指定しない場合は「.」としても良い
  - カレントディレクトリ一つ上の階層は、「../」(ドット2つとスラッシュ)で表す。次の階層を指定しない場合は「..」としても良い
  - ユーザーのホームディレクトリは「~」(チルダ)で表す。

#### ***コマンドプロンプト(シェルプロント)の見方***
コマンドラインではユーザー@ホスト名、カレントディレクトリ名と記号(#、$、%)の順に表示されている。記号は[シェル](https://ja.wikipedia.org/wiki/シェル)によって異なる。bashでは#がrootユーザー(管理者)、$が一般ユーザーを意味する。下記はCentOSというLinuxOSの場合での例である。
* rootユーザーの場合
       
```
[root@localhost ~]# cd ..
[root@localhost /]# cd ~
[root@localhost ~]#
```
  * 一般ユーザーの場合
```
[user@localhost ~]$ mkdir test
[user@localhost ~]$ cd test
[user@localhost test]#
```


### 2. 基本的なLinuxコマンド

- ***コマンド集***
cd以外のリンクは日本語のman[^1]ページに飛びます

    * [cd](https://man7.org/linux/man-pages/man1/cd.1p.html) [ディレクトリ名]
        * ディレクトリの移動
        * 例：homeディレクトリへの移動
        ```sh
        $ cd /home
        ```
    * [mkdir](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mkdir.2.html) [ディレクトリ名]
        * ディレクトリの作成
        * 例：test1という名称のディレクトリをカレントディレクトリに作成
        ```sh
        $ mkdir ./test1
        ```

    * [ls](https://linuxjm.osdn.jp/html/gnumaniak/man1/ls.1.html) [ディレクトリ名]

        * 指定したディレクトリ配下のファイル一覧の表示
        ```sh
        $ ls ./test1
        ```
    * [pwd](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/pwd.1.html)
        * カレントディレクトリの確認
    * [mv](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/mv.1.html) [ファイル名]　[移動先]
        * ファイル・ディレクトリの移動、リネーム
        ```sh
        $ mv ./test1/test ../
        ```
    * [cp](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/cp.1.html) [ファイル名]　[コピー先]
        * ファイルやディレクトリのコピー
        ```sh
        $ cp ../test1 ./test1/
        ```
    * [touch](https://linuxjm.osdn.jp/html/gnumaniak/man1/touch.1.html)　[作成するファイル名]
        * ファイルの作成
        ```sh
        $ touch test01.txt
        ```
    * [rm](https://linuxjm.osdn.jp/html/GNU_fileutils/man1/rm.1.html) [ファイル名]
        * ファイルやディレクトリの削除
        ```
        $ rm test01.txt
        $ rm -fr test1
        ```
    * [more](https://linuxjm.osdn.jp/html/util-linux/man1/more.1.html)　[ファイル名]
        * ファイル内容の出力(1画面ずつ表示)
    * [less](https://linuxjm.osdn.jp/html/GNU_less/man1/less.1.html) [ファイル名]
        * ファイル内容の出力(ページ表示)、moreの進化版
    * [cat](https://linuxjm.osdn.jp/html/gnumaniak/man1/cat.1.html) [ファイル名]
        * ファイル内容の連結出力
        ```
       $ more test01.txt
       $ less test01.txt
       $ cat test01.txt
        ```
    * [find](https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html)
        * ディレクトリ階層を辿り、ファイルを検索
        ```
        $ find . -type f -name "file"
        ```
    * [grep](https://linuxjm.osdn.jp/html/GNU_grep/man1/grep.1.html) [パターン] [ファイル]
      * パターンにマッチする行の表示
      ```
      $ cat file01.txt
      write memo
      aaaa
      aaaabbb
      $ grep "write" file01.txt
      write memo
      ```
      下記例はwriteというパターンにマッチする行を含むファイルをカレントディレクトリから再帰的に列挙するコマンド例(rオプションで再帰的に探索、lオプションでパターンマッチしたファイルの列挙)
      ```
      $ grep -rl "write" .
      file01.txt
      ```

### 3. 標準入出力の制御

- ***標準入出力について***
プロセスの生成(コマンドの実行など)時にファイル記述子の0〜2が下記のように割り当てられる。
    - 標準入力…キーボード等。ファイル記述子は「0」
    - 標準出力…コマンドを実行したデバイス。ファイル記述子は「1」
    - 標準エラー出力…コマンドを実行したデバイス。ファイル記述子は「2」
    ```
    $ ls aaa bbb
    ls: cannot access bbb: No such file or directory ⇦標準エラー出力
    aaa ⇦標準出力
    ```
- ***リダイレクション***
「\<」、「>」等を使用して、入出力を切り替えられる。
  - 標準出力、標準エラー出力のリダイレクト
標準出力のみをファイルに出力
```
$ ls > file1
$ ls 1> file2
```
標準エラー出力のみをファイルに出力
```
$ ls 2> file3
```
標準出力、標準エラー出力の両方をファイルに出力
```
$ ls &> file4
$ ls >& file5
$ ls 1> file6 2>&1
```
ファイルから標準入力からコマンドへの取り込み
```
$cat file7
write memo
a
b
c
d
$ grep "memo" < file7
write memo
```
file7から"memo"にマッチする行を表示している。

- ***パイプ***
「|」を使用することで、コマンドの標準出力をパイプの後に記述したコマンドの標準入力に渡すことができる。
```
$cat file7
write memo
a
b
c
d
$ cat file7 | head -2
write memo
a
```


### 4. エディタについて
CLI上で使用できるエディタにはVim、emacs、nano等々が存在する。
Vimとemacsが二大巨塔
ここではVimを紹介する。
- ***Vim***
vimはモード型エディタであり、モードを切り替えて、編集等を行う。通常は「ノーマルモード」で、編集するときは「挿入モード」に切り替える。


  * [vim(vi)](https://vim-jp.org/vimdoc-ja/) [ファイル名]
　　* vimエディタでファイルを(作成し)編集する
```sh
$ vim test02.txt
```
Enterキーを押下するとvimがtest02.txtを開く
```
+---------------------------------------+
|#                                      |
|~                                      |
|~                                      |
|~                                      |
|~                                      |
|"test02.txt" [New file]                |
+---------------------------------------+
```

<br>

- ***Vimのモードについて***
  - 挿入モード
   　 「i」で挿入モードとなり、編集できる。
  - ノーマルモード
    * escキーでノーマルモードとなる。
    * 「:w」は保存、「：wq」は保存して終了、「:q!」は保存せずに終了する。
    * 「dd」はカーソルのある行を削除
    * 「:%d」は文字の全削除
    * 「u」で前の操作の取り消し、「ctrl+R」でやり直しができる

挿入モードの表示
```
+---------------------------------------+
|write memo                             |
|~                                      |
|~                                      |
|~                                      |
|-- INSERT --                           |
+---------------------------------------+
```
ノーマルモード（保存終了)
```
+---------------------------------------+
|write memo                             |
|~                                      |
|~                                      |
|~                                      |
|:wq                                    |
+---------------------------------------+
```

### 参考
Linux
[第1回 Linuxとは｜Linux技術者認定機関　LPI-Japan [エルピーアイジャパン]](https://lpi.or.jp/lpic_all/linux/intro/intro01.shtml)
Linuxコマンド
[JM Project (Japanese)](https://linuxjm.osdn.jp)
Vim
[Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/)

[^1]:マニュアルのこと