Linuxの基礎コマンド

## はじめに
完全未経験からWebエンジニアを目指しています。
今回は枯れた技術（いい意味で）であるLinuxについて学習しました。本記事はアウトプットのためにまとめたものです。勉強中ですので間違いがあれば指摘していただければ幸いです。
 
## Linux基礎コマンド
ブラウザ上で動くLinuxであるJSLinuxというものを使いました。

https://bellard.org/jslinux/

起動に少し時間がかかるかもです。
### cd
ファイルシステム内を移動
構文　：　**cd [ディレクトリ]**
<br>
主に使うディレクトリ
| 記号| 説明 |
|:-:|:-:|
| 　 / 　| ルートディレクトリ  |
|  　~　 |  ホームディレクトリ |
|  　. 　| 現在のディレクトリ（カレントディレクトリ）  |
|  　..　 | 一つ上の階層（親ディレクトリ）  |

ここでログインユーザがtaroの場合
* cd 
* cd ~
* cd ~taro

ホームディレクトリに移動するという意味になります

### pwd
現在のパスの表示 (**絶対パス**←最初から最後までディレクトリが記述されている)
また、PWD変数には現在のディレクトリの絶対パスが格納されています。
故に
![Screenshot 2023-07-23 at 9.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/96fd227d-8211-3a45-b8f6-405e76291ca7.png)


という同じ結果が得られます。（PWDはシェル変数）
主要なシェル変数
| 変数名 | 説明 |
|:-:|:-:|
|  PATH |  コマンド検索パス |
|  HOME |  ユーザーのホームディレクトリ |
|  HISTFILE |  コマンド履歴を格納するファイルを定義 |
|  LANG |  言語情報 |

### ls
ファイルとディレクトリの一覧表示
構文：　**ls [オプション]　[ディレクトリorファイル名]**
主なオプション
| オプション | 説明 |
|:-:|:-:|
|  -l |  詳細な情報を含めて表示 |
|  -i |  iノード番号を含めて表示 |
|  -a |  隠しファイルの表示(.から始まるファイル) |
| -R| サブディレクトリの中まで表示|

![Screenshot 2023-07-23 at 9.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/1b7bf7f3-f79f-291c-9b83-75dc194cfde4.png)


### mkdir
ディレクトリ作成
構文：　**mkdir [オプション]　ディレクトリ名**
![Screenshot 2023-07-23 at 9.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/405caeeb-3e83-a50a-ee83-5b840459a238.png)
上図では、**test_dir**を作成とオプションに`-p`を用いて**hello_dir/subdir**のような中間ディレクトリも同時に作成することができます。

### rmdir
ディレクトリ削除
構文：　**rmkdir [オプション]　ディレクトリ名**
![Screenshot 2023-07-23 at 9.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/4651b950-505a-2c8f-686e-b2802a6bbf5f.png)
rmdirはディレクトリ内に`ファイルが存在している`と削除することができません。
上図ではファイルが存在していたためファイルを削除して、`-p`を指定することにより中間ディレクトリも同時に削除することができます。


### cat
ファイルの中身を表示

![Screenshot 2023-07-23 at 9.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/28ff3383-0dec-5bb6-f474-a21641964d10.png)
`-n`をつけると出力に行番号が表示されます。

### less
ファイルの中身をスクロール表示
catと違って、とても大きなファイルの内容を閲覧したいときに使うコマンドです。
qで終了することができます。

### tail
ファイルの末尾表示
構文：　**tail　[オプション]　ファイル名**
| オプション | 説明 |
|:-:|:-:|
|  -n | 行数を数字で指定  |
|  -f |  ファイルの内容が増え続けている条件下で、ファイルの末尾を常に読み取る（ログファイルのモニタに有効） |

### touch
テキストファイル作成
構文：　**touch　ファイル名**
空のファイルを作成します。ファイルの中身も記述したければ、**vi**コマンドもしくはecho 〇〇　>> ファイル名　を使用しましょう。

### rm
削除！
構文：　**rm [オプション]　ファイル名**
| オプション | 説明 |
|:-:|:-:|
|  -i | 削除する前にユーザーへ知らせる  |
| -f  |  ユーザーへの確認なしに削除する |
| -r  |  ディレクトリ内に何か存在していても、全て削除 |
### mv
移動及び名前変更
構文：　**mv  前ファイル名（or dir）　後ファイル名(or dir)**


![Screenshot 2023-07-23 at 10.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/d392f1f6-6a42-61b1-7768-537f2da2ec50.png)
上図では、touchコマンドで空ファイルを作成。
mvコマンドで**test.txt**を**sample.txt**へ名前変更。
mvコマンドで**sample.txt**を**test**ディレクトリへ移動。
rmコマンドのオプション`-r`で**test**ディレクトリの中身も共に削除。

### cp
コピー
構文：　**cp　ファイル名**
| オプション | 説明 |
|:-:|:-:|
|  -i | 同名ファイルが存在する場合ユーザーへ上書きするか知らせる  |
| -f  |  強制上書き |
| -r  |  階層をそのままコピー |

![Screenshot 2023-07-23 at 10.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/3a46ceae-14ac-3856-632c-8e1096bc7929.png)
上図ではrootディレクトリの中身全てをhomeディレクトリに強制コピーするという内容です。

### ln
リンク作成
ハードリンクとシンボリックリンクがあります。イメージ的には、、
* ハードリンク：　コピーのようなもの。元ファイルが削除されても機能する。
* シンボリックリンク：　ショートカットのようなもの。元ファイルが削除されると機能しなくなる

あくまでイメージです

**ハードリンクの作成**
![Screenshot 2023-07-23 at 11.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/30539319-e280-9a50-53eb-d0004b1523a4.png)
iノード番号も権限も元ファイルと同じです。
元ファイルを削除してもハードリンクは機能します。

**シンボリックリンクの作成** 
![Screenshot 2023-07-23 at 11.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/ba1b3b30-cef8-ce34-3fef-44685c386bf6.png)
オプションに`-s`を使います。元ファイルが削除されるとシンボリックリンクは機能しません。



### find
ファイル検索
構文：　**find　[path] [オプション]　[式]**
| オプション | 説明 |
|:-:|:-:|
|  -name | 指定したファイル名で検索する  |
| -type  |  ファイルのタイプで検索する（d:ディレクトリ, f:通常ファイル,　 l:シンボリックリンクファイル） |




### chmod
ファイル及びディレクトリのパーミッションを変更
![Screenshot 2023-07-23 at 11.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/d7904f4c-1308-904a-9a33-d4718ad02fad.png)
権限が読み込みのみだと
![Screenshot 2023-07-23 at 11.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/ca502cf7-414b-9e9a-c3bc-ed4c8455e731.png)
もちろん書き込みは不可である。
![Screenshot 2023-07-23 at 11.24.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/1dcb0554-dd6b-6145-fb3c-5e74b6e8cb89.png)
書き込み権限を付与するため**chmod**コマンドを行い権限を変更することができます。
画像では chmod 755ですがchmod u+w  or chmod 6??でも問題ないです。


### chown
ファイル及びディレクトリの所有者を変更
![Screenshot 2023-07-23 at 11.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/50321d31-21fe-aed4-47fa-bc0cedc51738.png)
画像はJSLinuxのユーザー一覧を表示しています。
この中のnobodyというユーザーを使って所有者変更を行います
![Screenshot 2023-07-23 at 11.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/05efcfe3-ae1a-2288-36cf-a595ba53d36d.png)
所有所変更を行いました。所有所変更を行うとパーミッションも考え直さなくてはなりません。
現在rootユーザーですので、**sample.txt**は書き込みができません。
書き込みをしたい場合はchmodで権限を付与しましょう。

### ps
現在実行中のプロセス一覧表示
プロセスとは実行中のプログラムのことです。

JSLinux でオプションが期待通りの結果を返してくれなかったのでオプションに関しては以下の記事を参考にしてください。

https://eng-entrance.com/linux-command-ps#aux
### kill
ジョブやプロセスを終了させる
構文：　**kill [シグナルID or シグナル名]　PID**

代表的なシグナル
| シグナル番号 | シグナル名 | 意味 |
|:-:|:-:|:-:|
|  1 |HUP   | ハングアップ  |
|  2 |  INT |  割り込み (Ctrl+C)|
|  3 |  QUIT |  強制停止 |
|  9 |  KILL | 強制終了  |
| 15  |  TERM |  終了。killコマンドのデフォルト |

![Screenshot 2023-07-24 at 22.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/ccbcdb02-dfa6-585d-7c1f-416f2ea1bb57.png)

上図ではsleepコマンドをバックグラウンド（&）で実行。
psコマンドでプロセスIDの確認を行った。

![Screenshot 2023-07-24 at 22.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/95e7647e-26f2-5c00-f194-f91fde5464f7.png)

下にスクロールするとsleepコマンドのpsIDは115と分かったので
kill psIDで終了した。

![Screenshot 2023-07-24 at 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494258/8644089b-aa90-75f8-8470-372c92d2eded.png)
シグナルIDは指定しなければデフォルトとして15が適用されます。
上図のように指定することも可能です。

## 終わりに
人に説明することは非常に難しいですね。ですが、非常に身になりましたしLinuxの技術の面白さがわかりました。ひき続き学習を続けていきます！
学習中の初学者が作成したので間違っている箇所があれば指摘していただければ幸いです。



## 参考文書

https://linuc.org/textbooks/linux/

https://www.udemy.com/course/unscared_linux/

https://www.udemy.com/course/linuxlpic/learn/lecture/14966464#overview