【WIP】Linuxインプットしたことアウトプットします

#Linuxの学習記録
新人アプリケーションエンジニアがLinuxについて学習した過程を記録する。
目的はアウトプットによる知識の定着
#学習方法
今回は<a href="https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1">新しいLinuxの教科書</a>をベースに自身のPC環境に仮想環境を作ってその中でLinuxの学習を行う
#Linuxとは
LinuxはオープンソースのOSであり、サーバ向けによく使用される。その理由として、拡張性の高さと多くのソフトウェアを有している点にある。

- カーネル：OSの中核であり、ハードウェア制御を担当するとともに、コマンドのプロセス制御も実施
- ディストリビューション：広義のLinuxであり、Lnixの種類のこと（CentOS・Ubuntu）など

#シェルとコマンド
###コマンドが実行される仕組み
1. キーボードから入力されたコマンド文字列を受け取る
2. 対象のコマンドを探す
3. 見つかったコマンドを実行
4. 実行結果を画面に返す<br>
コマンドの実行はカーネルが担当するが、ユーザが直接カーネルを操作する仕組みとはなっていない。
「**シェル**」はコマンドとカーネルの間に入って、カーネルのインターフェースとしての役割を持つ**ソフトウェア**のことを指す。

####二種類のコマンド実行方法

- インタラクティブ操作<br>
   ユーザがキーボードを通して直接シェルを操作する方法
- シェルスクリプト<br>
実行したいコマンド群を事前にテキストファイル等に記述しておき、そのファイルをシェルに指定することで一連の処理を実行する仕組み

####シェルの種類
- sh<br>
 色々なシェルの中で共通項的な位置にあり、 ほとんど全ての UNIX で利用できる標準的なシェルであるため、 シェルスクリプトの作成には B シェルがよく用いられる。
- csh<br>
B シェルに比べ、ヒストリー機能やジョブ制御、 エイリアスなどの機能が付加されており、対話形式で使用する場合に便利である。
- bash<br>
 shを基本として、機能を拡張したシェル。bash は、元来 B シェル において貧弱であった、 ユーザーインターフェイスとしての機能を強化するため、 ヒストリー機能、エイリアスなどが追加されている。



####プロンプトについて
- プロンプト
`[osumi@localhost]`のような表示のこと。シェルがコマンドの入力を受け付けられる状態であることを表している。

####調べる・探す系コマンド
- `find {検索開始ディレクトリ}{検索条件}{アクション}`ファイルを探す。引数に`-name`でファイル名前で探せる。

####テキストエディタ
Vim:Linuxのデフォルトのテキストエディタ。扱うには`vim`コマンドを使用する。

- `vim`Vimの起動
- `:q`Vimの終了（`:w`保存/`:q!`保存せず終了）
- `x`文字の削除（コマンドモード）
- `x`or`d{option}`カット
- `p`貼り付け
- `y`コピー（`yy`：）一行コピー
- `u`undo
- `/{検索文字列}`テキスト内検索（`n`次の検索地に移動）
- `%s/{置換文字列}{置換後文字列}`文字置換

####bashの設定
エイリアス：コマンドに別名をつける方法。毎回長いオプションをつけるのは面倒だから、それ別名として登録することで、楽になろう！の発想。

- エイリアスの登録：`$ alias ls='ls -al'`
- エイリアスの削除：`$ unalias ls`

#ファイルパーミッション
linuxのファイルには必ず所有者が存在しており、所有者はそれぞれの所有ファイルのアクセス権限を自由に設定できる。

- 自分のユーザグループを知る方法：`groups`コマンド
- そのファイルの権限状況を見たい：`ls -l`コマンド（r/w/xで表現）

rootユーザ：システム管理者権限を持ちつつ、すべての操作が許可されるユーザ
→他OSと同じく、必要な時だけ管理者権限ユーザに移行して実行するのが望ましい

- 一時的に別のユーザになるためのコマンド：`su -`
- スーパーユーザでないと実行できないコマンドを実行したい（一般のままで）：`sudo`

#プロセスとジョブ
###プロセス
コマンドの実態はディスクに保存されたファイルに過ぎない。コマンドを実行すると、カーネルはディスクからexeファイルを読みだしてメモリに展開、実行される。この**メモリに展開されて実行状態にあるプログラム**を**プロセス**という。プロセスには一意のプロセスIDがカーネルによって割り当てられ、これでプロセスを管理していく。また、一意で管理されるため、混合することがない。

- 実行プロセス一覧表示：`$ ps -l`
- プロセスの終了`$ kill {プロセスID}`

###ジョブ
シェルから見た処理の単位を**ジョブ**という。（プロセスはカーネルから見た処理の単位）<br>コマンドラインに入力した１行が一つのジョブに当たる。

ジョブの複数操作：`$ ctrl+z`（ジョブを一時停止した状態＝コマンド受付可能状態へ）

- ジョブのバックグラウンド実行：`$ bg %{ジョブ番号}`
- ジョブをフォアグラウンドで操作：`$ fg %{ジョブ番号}`
- ジョブの状態を確認：`$ jobs -l`
- ジョブの終了：`$ ctrl+c`
- ジョブの終了（バックグラウンド）：`kill %{ジョブ番号}`

###標準入出力とパイプライン

コマンドをうまく組み合わせて、連携させる仕組みについて。
####リダイレクト

標準入出力先を変更すること。ex)キーボードからの入力が標準であった場合、それをファイルからとし、ファイルの中身を読み込ませる。画面出力を標準としているが、リダイレクトで結果をファイルに保存する。※`>`記号で引数を指定することで実現。同一ファイルの末尾に追記するリダイレクトの場合は`>>`を用いる。

####パイプライン

あるコマンドの結果を別のコマンドの入力にリダイレクトし、複数のコマンドを連携させる方法。パイプ`|`を用いて次のように記述する。`{コマンド１}|{コマンド２}|...`

####フィルタ
標準入力を入力として受け取り、標準出力に出力するコマンド

- `cat`:入力をそのまま出力
- `head`:先頭の部分を出力（引数で指定）
- `tail`:末尾の部分を表示
- `grep`:指定した検索パターンに一致する行のみ表示
- `sort`:並べ替える（`-k`で何列目に対してかを指定可能）
- `uniq`:重複業を取り除く
- `tac`:逆順に出力
- `wc`:行数やバイト数を出力（行数/単語数/byte数）
- `diff`:差分を表示

###正規表現

linux上で正規表現を記述する場合は一重引用符で囲む必要がある。（シェルの予約語？に展開されてしまうため）

- `.`:任意の一文字
- `\`:エスケープシーケンス（メタ文字を）
- `[a-k]`:A～ｋの一文字と合致
- `^`:行頭であることを示す
- `[^A]`:指定した文字（A）以外の文字に合致
- `$`:行末であることを示す
- `*`:直前文字の0回以上の繰り返し
- `+`:直前文字の1回以上の繰り返し
- `?`:直前文字の0or1の繰り返し
- `{m,n}`:m回以上n回以下の繰り返し
- `(str)`:文字列のグループ化
- `|`:or条件

##シェルスクリプト
###基本を押さえる
シェルの**コマンドラインをあらかじめ記述しておくファイル**のことを**シェルスクリプト**と呼ぶ。

```shell:homesize.sh
#!/bin/bash

du -h ~ | tail -n 1

#これはコメントです#
#変数は以下のように記述します。
hello=helloWorld
#参照するには$を変数名の前につけます。
echo $hello
```
**解説**
`#!`は**シバン**と呼ばれ、どのシェルで動かすのか？を宣言しているもの。シバン行以降に実際のコマンドを記述する。最後に対象シェルスクリプトに実行権限`chmod +x`を与える。

```shell:実行方法

#ファイル名のみを指定して実行
$ ./homesize.sh
#シェルの引数として実行
$ bash homesize.sh
#sourceコマンドを利用して実行
$ source ./homesize.sh
```
**解説**
上２つに関しては同じ動作。最後はサブシェルを介して実行される形式なので、カレントシェル環境に依存する。

###シェルスクリプトの配置場所
1. 任意のディレクトリに格納<br>
　 →この場合、実行方法は`bash {スクリプトファイルへのpath}`
2. 任意のbinディレクトリに格納し、環境変数PATHに指定<br>
　 →この場合、**ファイル名のみ**の記述で実行できる（cat,lsのように）解釈

###位置パラメータ
シェルスクリプトの引数を、シェルスクリプト内で使用するための機能。
シェルスクリプトの引数はそれぞれ、`$1``$2`...という形で、内部で参照できる。また、`$#`で引数の個数を参照できる。

##アーカイブと圧縮
- **アーカイブ**：複数のファイルやディレクトリをまとめたファイルを作成すること
- *圧縮**：中身を壊さずファイルサイズを小さくすること<br>`gzip`コマンドでファイルの圧縮。`guzip`で圧縮ファイルの展開

##ソフトウェアパッケージ






##[補足]gitのコマンド操作
ファイルのバージョン管理システムのこと
**基本**

- **リポジトリ**：ファイルの変更履歴を管理しておく領域 hogehoge/.gitがその領域に当たる
- **ワークツリー**：リポジトリの内容をファイルとして展開する領域 hogehogeがその領域に当たる

**gitのコマンド**

- **git init**：対象ファイルをgit管理するためのコマンド。.git（リポジトリ）が配下に作られる）
- **git add**：変更したファイルをリポジトリに履歴として追加（SourceTreeでいうステージに上げる）
- **git commit**：実際にリポジトリに変更履歴を追加する。`-m`でコミットメッセージの入力。使用しないとvimが起動して複数行メッセージを記述できる
- **git status**：現在のワークツリーの状態を表示（SourceTreeでいうファイルステータス欄。変更があったファイルの状態が上がってくる）
- **git diff**：変更内容の確認（SourceTreeでいう、差分確認欄）
- **git log**：変更履歴の確認
- **git revert**：対象コミットの取り消し（変更分削除）
- **git branch**：ブランチの一覧表示。引数にブランチ名を指定することでブランチを切れる