初学者がLinuxを学んだのでアウトプットする

#はじめに
Linuxについて学んだのでLinuxについての基礎的なことをまとめました。


#Linuxとは
OSの一種で1991年にリーナス・トーバルズ氏により有料であったUnixをベースに開発された。
有料であったUnixと違い無料で使用できオープンソースであったため広く普及した。

#Linuxの特徴
- 無料で使用できる。
- オープンソースであるため世界中の誰でもがプログラムの改変ができる。
- サーバーや組込みシステムなど幅広い用途で使用できる。
- 低スペックのPCでも動く。
- OSの開発ができる。
- 日本語対応していない部分が多い。
- 商用アプリが動かない。（Microsoft　office等）

#LinuxカーネルとLinuxディストリビューションとは
Linuxは厳密に2つの意味に分けられます。
Linuxカーネルとは**狭義のLinuxでありOSの中核となるソフトウェア**になります。
しかし、カーネルはハードウェアとソフトウェアの仲介を行うのが役割なのでカーネルだけではPCを動かすことはできません。
なのでOSとして使用するために様々なソフトウェアと組み合わせたパッケージである**Linuxディストリビューション**が必要になってきます。
これによって初めてOSとして使うことができるようになり、ディストリビューションは1000種類以上存在します。
一般的にLinuxと呼ぶとディストリビューションを指すことが一般的です。

##代表的なLinuxディストリビューション
###Debian系
- Debian
- Ubuntu

###RedHat系
- RedHatEnterpriseLinux
- CentOS

###Slackware系
- Slackware

[「Linux」と「ディストリビューション」の関係](https://linuc.org/study/knowledge/337/)
[ディストリビューションとは](https://lpi.or.jp/lpic_all/linux/intro/intro02.shtml)

#シェルとは
シェルとはLinuxのCLIを提供するソフトウェアつまりユーザーとカーネルの仲介役をするものです。
ユーザーがコマンドを入力するとシェルは解釈してLinuxカーネルに伝えます。コマンドが実行されるとシェルはコマンドの実行結果を文字列で出力します。これがシェルの役割です。
※CLI　・・・　Command Line Interface（キーボードからコマンドを入力して結果を文字列として返すインターフェース）

```
[bell@localhost~]$
```
上記がシェルの画面になります。左からユーザー名、ホスト名、プロンプト（＄）でプロンプトの後ろにコマンドを入力します。
Macの場合であればターミナルの中でシェルが動いているということを誤解せずに覚えてください。
ターミナルは入出力の画面を提供するソフトウェアでシェルはコマンドを解釈するソフトウェアです。
シェルにはさまざまな種類がありますが**sh**と**bash**が用いられることが多いです。

#Linuxのディレクトリ構造
##ディレクトリとは
ファイルが保存されている場所のこと。フォルダと同じ概念。

| ディレクトリ | 意味 | 指定方法 |
|:-:|:-:|:-:|
| カレントディレクトリ  |  現在自分がいるディレクトリ | 「　.　」  |
|  親ディレクトリ |  ひとつ上の階層のディレクトリ  | 「　.. 　」 |
|  ホームディレクトリ | /home/ユーザー名　のディレクトリ  | 「　 ~　」　 |
|  ルートディレクトリ |  / ディレクトリ | 「　/　」  |
※「　~　」は「チルダ」と呼ぶ。

###/(ルートディレクトリ)
Linuxにあるすべてのディレクトリの始まりのディレクトリ

###bin
Binary Folderの略。
Linuxの動作に最低限必要な重要度の高いコマンドの実行ファイルを格納されていて、一般ユーザー及び管理ユーザーどちらのアクセスができる。

###sbin
ルートユーザー（管理者ユーザー）向けのコマンドの実行ファイルが格納されている。

###dev
deviceの略。
ハードウェア機器を表すファイルが保存されている。

###etc
Linuxで動作するアプリケーションの設定ファイルや、Linux自体の設定に関するファイルがある。

###home
ホームディレクトリ（ユーザーごとに割り振られる個人用ディレクトリ）がある。
ユーザーを作ると自動的に生成される。ユーザーはこのホームディレクトリ内でファイルやディレクトリを作れる。

###root
rootユーザーのホームディレクトリ。つまり管理者用のホームディレクトリということになる。

###tmp
temporaryの略
一時的に使うファイルやディレクトリを保存するディレクトリ。
アプリケーションの実行中に結果を一時的にファイルとして保存する場合に使用。
再起動すると保存されていたファイルは消えてしまう。

###var
ログファイルやキャッシュファイルなどの一時的なデータを残しておくためのディレクトリ。
tmpと違って再起動してもファイルは消えない。

[Linuxディレクトリ構造](https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332)
[Linuxのディレクトリ構成とは？](https://kitsune.blog/linux-directory)

#パスとは
ディレクトリやファイルの住所情報を表すもの。
ディレクトリの階層の区切りを「/」を用いて表す。

##絶対パスと相対パス
絶対パスは　**ルートディレクトリ（「　/　」）**から始まるパス。
相対パスは**カレントディレクトリ**から始まるパス。

##テキストファイルとバイナリファイル
###テキストファイル
- 文字列が書かれたファイル 
 - 文字コードで定められた文字だけが並んで格納されている
 - LinuxではOSに関わるほとんどの設定情報がテキストファイルで管理されている。 　 

###バイナリファイル
- 画像ファイルや音声ファイル、実行ファイルなど
 - テキスト以外のファイルだと考えてOK
 - 文字コード以外のものを含むファイル 

#コマンド
##cd　ディレクトリを移動する
change directoryの略。

```
$cd [オプション][ディレクトリ名]
```
オプションはあまり使われることがない

##pwd　カレントディレクトリを表示する
print name of working directoryの略。

```
$　pwd
/home/hoge
```
##ls　ファイルやディレクトリの一覧を表示する
listの略。

```
$　ls /　（ルートディレクトリ内にあるものを表示）
bin dev home lib64 mnt　proc (以下略)
```
###オプション
```
#ファイルの詳細情報を表示する
$ ls -l
#隠しファイルも含めたすべてのファイルを表示する
$ ls -a
#ファイル種別を表示する
$ ls -F
```
##mkdir　新しいディレクトリを作成する
make directory の略。

```
$ mkdir [オプション]<作成するディレクトリ名>
#hogeディレクトリを作成する
$ mkdir hoge
$ ls
fuga
```
####オプション
####-p 深いディレクトリを一度に作成する


```
#hogeディレクトリの下にfuga,piyoを作る
$ mkdir -p hoge/fuga/piyo
```
-pオプションによって事前にfugaディレクトリを作る必要がなくなります。
##rmdir　空のディレクトリを削除する
remove directoryの略。

```
#hogeディレクトリを削除する
$ rmdir hoge
```
####オプション

```
#親ディレクトリも削除する
$ rmdir -p ディレクトリ名

#削除した結果のメッセージを表示する。
#hogeディレクトリ下のfugaディレクトリを削除する
$ rmdir -v fuga
rmdir: ディレクトリ　'fuga' を削除しています

#ディレクトリがから出ないときにでるエラーを表示しない
$ rmdir --ignore-fail-on-non-empty ディレクトリ名 
```
##cat　ファイルの中身を表示する
concatenateの略。

```
$ cat [オプション] <ファイル名>

#行番号を表示するオプション
$ cat -n /etc/hosts
1 127.0.0.1 localhost
2 ::1 localhost6
```

##less ファイルの中身をスクロール表示するコマンド
less - opposite of more
長い内容のファイルの中身を確認するときにつかう

```
$ less [オプション]　　<ファイル名>
```
####スクロールの操作
| コマンド | 内容 |
|:-:|:-:|
| スペース、f  | 一画面下にスクロール  |
|  b | 一画面上にスクロール  |
|  j |  一行下にスクロール |
|  k | 一行上にスクロール  |
|  q |  lessコマンドを終了 |

##touch ファイルを作成する

```
$ touch <新規ファイル名>
```
ファイルが存在していないときは新規ファイル、存在しているときはタイムスタンプを更新する。

##rm ファイルを削除する
removeの略

```
$ rm <ファイル名>
```
削除すると完全に削除されるので注意。（ゴミ箱に残らない）
##mv ファイルの移動、ファイル名の変更
moveの略

```
$ mv [オプション]　<移動元>　<移動先>
$ mkdir foo
$ touch hoge
#ファイル名を変更
$ mv hoge fuga 
#ファイルをfooディレクトリに移動
$mv fuga foo
```
####オプション
```
#上書き前に確認する
$ mv -i hoge fuga
```
##cp ファイル・ディレクトリをコピーする
copyの略

```
$ cp [オプション]　<コピー元>　<コピー先>
#ファイルをコピー
$ cp hoge hoge_copy
```
####オプション

```
#上書きする前に確認する
$ cp -i hoge hoge_copy
#ディレクトリをコピーする
$ cp -r dir dir_copy
```

##ln リンクを貼る
リンクを使うことによってwindowsのショートカットのように深い階層にあるファイルのパスを短くすることができます。
###ハードリンク
ひとつのファイルの実体に複数の名前を付ける機能でもとのファイルを削除しても消えない。ただしすべてのハードリンクがなくなると削除されます。
平たく言うとハードリンクはファイルにあだ名をつけるイメージになります。

[ハードリンクとは](https://wa3.i-3-i.info/word1152.html)

###シンボリックリンクとは
リンク先のパス名が書かれた特殊ファイルでリンク先がファイルの実体です。
シンボリックリンクを残したまま実体のファイルを消したり移動したりすると参照できなくなる。

```
#シンボリックリンクを貼る
$ ln -s file1 file3
```
##find ファイルを検索する

```
$ find <検索開始ディレクトリ> <検索条件>　<アクション>
```

####オプション
```
# -name ファイル名を指定して検索する
$ find -name 
# -iname ファイル名を指定して検索する。大文字小文字は区別しない
$ find -iname
# type ファイルの種類で検索
$ find type 
```
##標準入出力
###標準入出力とは
プログラムが、特に何も指定されていない場合に利用するデータの標準的な入出力元
###標準入力
プログラムの標準の入力。キーボードが通常は使われる。
###標準出力
プログラムの標準の出力。ディスプレイが通常は使われる。
###標準エラー出力
プログラムのエラーを出力。ディスプレイが通常使われる。

##リダイレクト
リダイレクトは入出力先を変更する機能。
入力のリダイレクトであればコマンドではなくファイルから入力することで長いコマンドでも入力できる。
出力のリダイレクトであればディスプレイではなくファイルに実行結果を保存することができる。

| コマンド | 説明 |
|:-:|:-:|
|  コマンド > file |  コマンドの標準出力をfileに書き込む |
| 	コマンド >> file  |コマンドの標準出力をfileに書き足す   |
|  	コマンド < file | コマンドはfileの内容を標準入力として受け取る  |
| 	コマンド 2> file  |  	コマンドの標準エラー出力をfileに書き込む |
|  	コマンド > file 2>&1 |  	標準エラー出力の出力先を、標準出力の出力先と同じとする |

| 入出力 | 数値 |
|:-:|:-:|
|  標準入力 | 0  |
|  標準出力 |  1|
| 標準エラー出力  | 2  |

##パイプライン
複数のコマンドを連携させる機能

```
$ <コマンド１>　| <コマンド２>　| <コマンド３>
```

##パーミッション
ファイルやディレクトリが誰がどのように操作できるのか定めたのがパーミッションです。
ファイルには全てオーナーとグループが設定されていて権限管理されています。

```
#ファイルを作成
$ touch test.txt
#パーミッションを確認
$ ls -l 
-rw-r--r-- 1 bell users 0 12月 22 16:28 myfile.txt 
```
細かく分けてみてみると

```
①- ②rw- ③r-- ④r--
```
①はファイルのタイプを表します。

| 文字 | 説明 |
|:-:|:-:|
| -  |  通常のファイル |
|  ｄ | ディレクトリ  |
|  l | リンクファイル  |

②はオーナーのパーミッション、③はグループのパーミッション、④はその他のユーザーのパーミッションを表します。

| 記号 | 説明 |
|:-:|:-:|
| ｒ  | read(読み取り)  |
|  ｗ |  write(書き込み) |
|  ｘ |  execute(実行) |

上記の例ならオーナーは読み取り書き込みができ、グループとその他のユーザは読み取りしかできないという意味になります。

##chmod パーミッションを変更する
change mode の略。

コマンド

```
$ chmod [ugoa] [+-=] [rwx] <ファイル名>
```
| 記号 | 内容 |
|:-:|:-:|
|  u |  所有者 |
|  g |  グループ |
|  o |  その他 |
|  a |  すべてのユーザー |

| 記号 | 内容 |
|:-:|:-:|
|  + | 権限を追加  |
|  - |  権限を削除 |
|  + |  記述した権限にする |

数値でも指定することができます。

```
$chomod <8進数の数字> <ファイル名> 
```
| パーミッション | 数値 |
|:-:|:-:|
|  r | 4  |
|  w |  2 |
|  x |  1 |

この場合それぞれのユーザーのパーミッションの数値を足し合わせて入力することでパーミッションを変更できます。
例えばオーナーはすべての権限、グループとその他のユーザーは読み取りのみであれば
オーナー　4+2+1=7
グループ、その他のユーザー　4+0+0=4
よって

```
$ chmod 744 text.txt
```
と入力すれば変更ができます。

##スーパーユーザ
switch user and do　の略で、管理者権限を持つ特別なユーザーです。

```
$ sudo <コマンド>
```
##プロセスとは
実行中のプログラムのことをプロセスと言います。
##ps プロセスを表示する

```
$ ps [オプション]
```
###オプション

```
#全ユーザーのプロセスを詳細情報も合わせて表示
$ ps aux 
```

##ジョブ
ジョブは**シェルごとに管理される**まとめて実行されるプロセスの集まり。
プロセスは**OS全体で管理されている**ので混同しないようにしてください。

##フォアグラウンドとバックグラウンド
シェルの画面内でコマンドを実行することをフォアグラウンド、画面外で実行することがバックグランドと呼びます。
処理に長い時間のかかるコマンドをバックグラウンドにすることで処理を待たなくても別のコマンドを入力することができます。

##jobs
現在のジョブの一覧を確認する

```
$ jobs
```

##fg
ジョブをフォアグラウンドにする

```
$ fg % <ジョブID>
```

##bg
ジョブをバックグラウンドするコマンド

```
$ bg 　％　<ジョブID>
```

##kill
ジョブやプロセスを終了させる。

```
$ kill ％　<ジョブID>
$ kill <プロセスID>
```

##最後に
とりあえずざっと概念程度をまとめました。
まだまだ奥深い話があるのでこれから少しずつ勉強していきたいと思います。