Linuxの基本まとめてみた

# Linuxの基本まとめてみた
Linuxの基本操作まとめをまとめてみました。

# Linuxとは

■ Linuxの特徴

```
- オープンソースであり、無料で誰でも利用できる
- 品質の高い多くのソフトウェアを利用できる（Apache, HTTPServerなど）
- 世界中で利用されているので信頼性が高い
- 操作を自動化するための仕組みが用意されており、サーバーの運用がし易い
```

■ Linuxの欠点

```
- ドキュメントが英語ばっかり
- ソフトウェアによって日本語が文字化けする
```

# シェルとは　　　
Linuxカーネルは直接人間が操作できるようになっていないため。

ユーザーとカーネルの間に命令を伝達するユーザーインターフェースが必要です。


このユーザーインターフェースを担うのがシェルになります。

## 有名なシェルの種類

■ sh
シェルスクリプトを描くときにより利用される。

■ bash
shを基本として、機能を拡張したシェル。
多くのLinuxのログインシェルとして利用されています。

■ zsh
比較的新しいシェルで、bashtcshをはじめとした他のシェルの機能を積極的に取り込み、さらに独自の拡張を加えたシェル。
高機能な分、全ての機能を覚えるのが難しいですが、慣れれば他のシェルを圧倒します。

シェルの種類はたくさんありますが、初心者におすすめなのはbashです。
Linuxのデフォルトシェルで、利用する機会も多いです。


## ファイルとディレクトリの基本コマンド

| コマンド | 機能 |
|:-----------|------------|
| pwd     |  カレントディレクトリを表示     |　
| cd       | カレントディレクトリを変更          |
| ls       | ディレクトリ内のファイルを表示          |

### lsコマンド
lsはファイルやディレクトリを一覧表示するコマンド

例）　ディレクトリを引数にしてlsコマンド実行

```
➜  ~ ls /
Applications Library      System       Users        Volumes      bin          cores        dev          etc          home         opt          private      sbin         tmp          usr          var
```

lsに-lオプションをつけると、ファイル名だけではなくファイル属性を同時に表示します。

```
➜  sugi-selfcare-rails git:(feature/new_guest_user) ✗ ls -l
total 912
-rw-r--r--     1 root  root    3115 11  1 13:52 Gemfile
-rw-r--r--     1 root  root   23015 11  8 13:35 Gemfile.lock
-rw-r--r--     1 root  root    8385  9  2 18:33 README.md
-rw-r--r--     1 root  root     258  9  2 18:33 Rakefile
```

## ファイル操作の基本コマンド

### mkdirコマンド
```
mkdir [オプション]<作成するディレクトリ>
```
新規でディレクトリ作成する時のコマンド
https://www.k-tanaka.net/unix/mkdir.php

### touchコマンド
```
touch <新しいファイル名１>　<新しいファイル名２>...
```
新規でファイル作成する時のコマンド
https://www.k-tanaka.net/unix/touch.php

### rmとrmdirコマンド
```
rm [オプション]<削除するファイル名>
```
```
rmdir <削除するディレクトリ>
```
rmでファイル削除、rmdirでディレクト削除できます。

https://www.k-tanaka.net/unix/rm.php
https://www.k-tanaka.net/unix/rmdir.php

### catコマンド
```
cat [オプション]<ファイル名>
```
ファイルの中身を確認したいときに利用するコマンド
https://academy.gmocloud.com/lesson/20191111/8091

### lessコマンド
```
less [オプション]<ファイル名>
```
「less」は、テキストファイルを1画面ずつ表示するコマンド
https://atmarkit.itmedia.co.jp/ait/articles/1702/10/news022.html

### cpコマンド
```
cp [オプション]<コピー元>...<コピー先>
```
ファイルをコピーするためにはcpコマンドを利用します。
https://www.k-tanaka.net/unix/cp.php

### mvコマンド
```
mv [オプション]<移動元>...<移動先>
```
ファイルを移動させるにはmvコマンドを利用します。
mvコマンドの使い方はcpコマンドと似ており、移動先がファイルかディレクトリかで意味が変わります。
https://www.k-tanaka.net/unix/mv.php

### lnコマンド
```
ln [オプション]<リンク元ファイル名>...<リンク名>
```
Linuxファイルシステムでは、ファイルに別名をつけることが可能です。この機能をリンクと言います。
別名をつけることでリンクを貼ることが可能です。

リンクファイルには、ハードリンクとシンボリックリンクがある。

```
ハードリンク　→ 複数の実名を付ける処理
シンボリックリンク　→ 別名を付ける処理(シンボリックリンクを作成すると，新たにファイルが生成され，その内容として，リンク先のファイル名とパスが保持される)
```

基本的にはシンボリックリンクを利用するケースが多い。
https://www.k-tanaka.net/unix/ln.php


## 探す、調べるの基本コマンド

### findコマンド
```
find [検索開始ディレクトリ]<検索条件><アクション>
```
その名の通り、ファイルを探すコマンドです。他のコマンドと比べてオプションが多いのでググりながら利用がおすすめ。（もしくはhelpオプションで調べる）
https://eng-entrance.com/linux-command-find

### manコマンド
```
man <調べたいコマンド名>
```
manは指定したコマンドのオンラインマニュアルを表示するコマンドです。
一々、web見に行くのだるい場合はこのコマンドで調べる方が早いです。
https://eng-entrance.com/linux-command-man

### whichコマンド
```
which [オプション]<コマンド名>
```
whichコマンドは指定されたコマンド名をサーチパスから探して、見つかった実行ファイルのフルパスを表示します。
https://atmarkit.itmedia.co.jp/ait/articles/1703/16/news020.html#:~:text=which%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%83%95%E3%83%AB%E3%83%91%E3%82%B9%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82


## bashの設定について
### bashの設定ファイル
`etc/profile`はシステム全体で使用する設定ファイルです。全てのユーザーに共通の設定を行いたい場合はこのファイルに記載する。


`/.bash_profile`は各ユーザー個別の設定ファイルです。

`/.bashrc`も各ユーザー個別の設定ファイルです。


`/.bash_profile`も`/.bashrc`同様にユーザー個別の設定ファイルです。

`/.bash_profile`はログインした時だけ読み込まれて、`/.bashrc`は起動するたびの読み込まれる特徴があります。

ログイン時のみ一度だけ設定したい場合は`/.bash_profile`に、それ以外の場合は`/.bashrc`に書き込めばOKです。

ただ、基本的に多くの設定はbashを起動するたびに読み込む必要があるので基本は`/.bashrc`に書き込んでおけば問題ないです。

ちなみに設定を変更した場合はsourceコマンドで設定を反映することを忘れがちなので、変更したらsourceコマンドで反映まで一連で覚えておくといいでしょう。


bashをログインシェルとして読み込んだ場合は`etc/profile`-> `/.bash_profile`-> `/.bashrc`の順番に読み込まれます。



### エイリアス
既存のコマンドを毎回打つのがだるい時はエイリアス設定がおすすめ。

エイリアス設定例

```
alias <名前>='<コマンド>'
↓
alias ls='ls-F'
```
https://qiita.com/_ydah/items/18d242b632e5486fe912

## 7. ファイルパーミッション、スーパーミッションについて

Linuxは一つのマシンに複数のユーザーが同時ログインして操作することを前提として作られています。

そのため管理権限周りの知識をつけることが大事になります。

　`ls -l` でパーミッションの確認ができます

例）

```
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt
drwxr-xr-x  6 user group  20480  1月 1 00:00 ダウンロード
```

「-rw-r--r--」や「drwxr-xr-x」の先頭の10文字について。

```
最初の１文字目: ファイル種別※1
2文字目から4文字目:ファイルの所有者に対する権限
5文字目から7文字目:ファイルの所有グループに対する権限
8文字目から10文字目:その他に対する権限
```

※1: -の場合はファイル、dの場合はディレクトリ、lの場合はシンボリックリンク

例）-rw-r--r--

```
「ファイル種別」が「ファイル」-> -
「所有者」に「読み取り」と「書き込み」の権限 -> rw-
「所有グループ」に「読み取り」の権限 -> r--
「その他」に「読み取り」の権限 -> r--
```

| 記号 | 意味 |
|:-----------|------------|
| r     |  読み取り（read)     |　
| w       | 書き込み（write)          |
| x       | 実行（excute)          |

操作が許可されているときは「r」「w」「x」という記号が表示され。許可されてない時は「-」と表示されます。

## 権限を変更する

ファイルやディレクトリのパーミッションを変更するには、ファイルモードを変更するchmodコマンドを利用します。

```
chmod [ugoa][+-=][rwx]<ファイル名>
```

| 記号 | 意味 |
|:-----------|------------|
| u    |  オーナー     |　
| g       | グループ          |
| o       | その他のユーザ          |
| a       | ugo全て        |

| 記号 | 意味 |
|:-----------|------------|
| +    |  権限を追加する     |　
| -       | 権限を禁止する       |
| =       | 指定した権限と等しくする          |

最後のrwxは「読み取り」「書き込み」「実行」を表す

例）オーナーへの書き込み権限を追加

```
chmod u+w file.txt
```

例）数値モードによりパーミッションの変更

| 意味 | 数字 |
|:-----------|------------|
| 読み取り（r）    |  4    |　
| 書き込み(w)       | 2      |
| 実行（x）       | 1          |

例）　「rwxr-xr-x」を数値モード変更

```
chmod 755 file.txt
```

```
オーナー rwx = 7 (rwx = 4+2+1)
グループ = 5 (r-x = 4+1)
その他のユーザー = 5  (r-x = 4+1)
```

| 数字 | ２進数|  |
| :--- | :---: | ---: |
| 1 | 001 | --x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r-- |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |

## スーパーユーザー
スーパーユーザーとは管理者権限を持つ特別なユーザーです。
スーパーユーザーはあらゆる操作が許可された強い権限を持つユーザーで、パーミッションの影響を受けずに全てのファイルの読み込み、書き込み、削除が可能になります。
スーパーユーザーはユーザー名がrootであることからrootユーザーとも呼ばれます。

sudoコマンドを利用すれば、スーパーユーザーとして実行することが可能です。

例）

```
sudo cat /etc/shadow
```

## プロセスとジョブについて
Linuxカーネルはディスクから実行ファイルを読み出してメモリに格納し、そのメモリ内容にしたがってCPUがプログラムを実行します。

ここでメモリ上の実行状態にあるプログラムをプロセスと呼びます。

現在動作しているプロセスを確認する場合はpsコマンドを利用します。

``` shell
$ ps
  PID TTY           TIME CMD
 4460 ttys001    0:22.94 -zsh
36776 ttys003    0:00.02 docker-compose up
36777 ttys003    0:15.46 /usr/local/bin/docker-compose-v1 up
73188 ttys003    0:09.57 -zsh
```

シェルから見た処理の単位をジョブと呼びます。シェルのコマンドラインに入力している１つの行が、１つのジョブに当たります。

■ ジョブの終了

``` shell
kill %<ジョブ番号>
```

■ プロセスの終了

``` shell
kill <プロセスID>
```

## 標準入出力とパイプラインの基本コマンド
Linuxにはテキストを集計したり並べ替えたりといった、テキスト処理を効率よく行うための便利なコマンドがいくつも用意されています。

### wcコマンド
``` shell
wc [オプション] [ファイル]
```
wcは入力ファイルの行数、単語数、バイト数を数えるコマンドです。

``` shell
$ wc a.txt b.txt
       5       5      55 a.txt
       4       4      44 b.txt
       9       9      99 total
```

### sortコマンド
行単位でテキストをソートするコマンドです。デフォルトでは、辞書順（アルファベット順）に行を並び替えます。

``` shell
sort [オプション] [ファイル1]
```

file1の内容

``` shell
Hokkaido
Aomori
Iwara
```

``` shell
$ sort file1
Aomori
Iwara
Hokkaido
```

### uniqコマンド
連続した同じ内容の行を省略するコマンド。

``` shell
uniq [オプション] [ファイル]
```

file2の内容

``` shell
Hokkaido
Hokkaido
Aomori
Aomori
Iwara
```

``` shell
$ uniq file2
Hokkaido
Aomori
Iwara
```

### trコマンド
入力行の一部分を置換するコマンド

``` shell
tr <置換前の文字> <置換後の文字>
```

file3.txtの内容

``` shell
12345
abcde
ABCDE
```

``` shell
$ cat file3.txt | tr abc XYZ
12345
XYZde
ABCDE
```

### tailコマンド
ファイルの末尾を表示するコマンドです。デフォルトではファイルの末尾10行が表示されます。

``` shell
tail [オプション] [ファイル]
```

例）

``` shell
$ tail hoge.txt 
11
12
13
14
15
16
17
18
19
20
```

よく使う例としてファイルの追記を監視する方法があります。
ログを監視したい場合とかによく利用します。

```
tail -f [ファイル]
```

### diffコマンド
2つのファイルの差分を表示するコマンドです。


``` shell
diff [オプション] <比較元ファイル> <比較先ファイル>
```

a.txt

``` shell
aaXa
cccc
dddd
eeee
ffff
gggg
hhhh
iiii
jjjj
kkkk
```
b.txt

``` shell
aaaa
bbbb
cccc
dddd
eeee
GGGG
hhhh
iiii
jjjj
kkkk
```

``` shell
$ diff a.txt b.txt -u (-u オプションを指定するとユニファイル形式で表示)
--- a.txt       2021-02-14 21:23:13.388019400 +0900
+++ b.txt       2021-02-14 21:07:26.211076200 +0900
@@ -1,9 +1,9 @@
-aaXa
+aaaa
+bbbb
 cccc
 dddd
 eeee
-ffff
-gggg
+GGGG
 hhhh
 iiii
 jjjj
```

## 正規表現の基本コマンド

Linuxでは多くのテキストファイルを扱います。そのときに便利なのが正規表現です。

### grepコマンド
文字列を検索するコマンド

``` shell
grep [オプション] <検索パターン> <ファイル名>
```

例） sample1.txt

```
red
blue
yellow
green
orange
white
black
```

``` shell
$ grep blue sample1.txt
blue
```

検索やフィルタで使用するメタキャラクタ（ワイルドカード）は、以下のとおりです。
あいまい検索したいときに利用するケースが多いです。

| メタキャラクタ | 説明 |
|:-----------|------------|
| *    |  0文字以上の文字または文字列    |　
| ?      | 任意の1文字      |
| [文字列]      | [ ]内の任意の1文字          |
| [!文字列]      | [ ]内の任意の1文字以外          |

``` shell
a*
-> 「a」「ab」「abc」などのアルファベット小文字「a」から始まる文字または文字列

a?
-> ab」「a1」などのアルファベット「a」から始まる2文字の文字列

a[bcd]
-> 「ab」または「ac」または「ad」

a[!bcd]
-> 「aa」「a1」などのアルファベット「a」と2文字目がbcd以外の2文字の文字列
```

参考：　https://4thsight.xyz/1664

## ディレクトリ構成
Linux系OSのディレクトリ構成の標準規格は下記の通りです。
![スクリーンショット 2022-02-01 12.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/19e56d0c-67eb-1521-a320-3aa293af0fd5.png)


## まとめ
Linuxの基本をまとめました。

現時点でも細かいサーバーの操作をするときにはLinuxの知識が必要なので、この辺りの知識はざっくり頭に入れておくほうがよいでしょう。