【Udemyメモ】 もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説】

# もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説】

というUdemyの講座があって、約2年前にキャッチアップ、学びなおしがてらやっていたメモをここにまとめます。

セクション名、まとめという形で転記します。

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

基礎的すぎて多くの記事などで言語化すらされていないことまで網羅されているので良かったです。


## section2:シェルの基本

### 【シェルとは】
シェル・・・殻の意味
linuxカーネルを操作するためのインターフェース
linuxカーネルとシェルを分離しておくと次のようなメリットがある
・シェルを自分好みに取り換えることができる
・異なるOSもシェルで操作できる
・シェルにエラーが起きても、linuxカーネルへの影響が少ない。
UNIXの思想「１つのプログラムには１つのことをうまくやらせる」
bash・・・シェルの種類の一つ。最も主流で、linuxのデフォルトのシェル。
シェルの種類は他に、zshやtcshがある。

### 【シェルと混同しやすいもの。】
①ターミナル・・・ユーザーがコンピューター入出力する際に利用するハードウェアのこと。
リナックスの文脈では、ターミナルエミュレータのことを指して、
ターミナルというケースも多い。ターミナルエミュレーターとは、ターミナルをソフトウェアとして扱えるように実装したもの。
windows:putty,tera term
mac:ターミナル、iTrem2
②プロンプト
$
この部分。
ユーザーに入力を促している部分。
③コマンドライン
プロンプトの後ろのコマンド入力部分のこと。

### 【シェルの基礎コマンド】
・カーソル移動
ctrl + b 左に移動（backwardのb)
ctrl + f 右に移動 (forwardのf)
行頭に移動　ctrl + a （atamaと覚える)
行末に移動　ctrl +e (end の e)
・文字の削除
ls -lの"-l"を丸ごと消したいとき→ctrl + w 単語単位で削除。(単語のw)
・カットとヤンク
ヤンク・・・ペーストのこと。
ctrl + u・・・カーソル位置から行頭までカット
ctrl + k・・・カーソル位置行末までカット
ctrl + y・・・ヤンク（ペースト）　(yankのyと覚える)
・bashの補完機能
tabキーで補完できる。
例1. tou まで押した後、tabキーを押すと、補完してくれて、touchが出てくる。
例2. cd /ho でtabを押すと、 cd /homeとなる。

## section3 ファイルとディレクトリ

### 【Linuxとファイル】
・/bin/bashというファイルはどのようなファイルか
bashというシェルを利用するためのファイル
Linuxで扱うデータや機能はすべてファイルとして表現されている。
bashのようなシェルだけでなく、各種コマンドやLinuxカーネルも一つのファイル

### 【絶対パス・相対パス】
・絶対パス
ルートディレクトリを起点として表記するパス
メリット　あいまいさがない
デメリット　パスが深くなると長くなってしまう
    　　開発したマシンのディレクトリ構成に依存してしまう
・相対パス
カレントディレクトリを起点にする
. 現在のディレクトリ
..　親ディレクトリ
メリット　パスが短くなる。開発したマシンのディレクトリ構成にも依存しない。
デメリット

### 【pwdとcd】
pwd ・・・print working directory
cd ・・・change directory
cd ~
~・・・チルダ、と読む。cd ~でホームディレクトリに移動できる。
チルダ展開と呼ぶ。

### 【ls】
一覧表示
ls -aで、隠しファイルも含むすべてのファイル表示 aはallの略
隠しファイル　.から始まるもの

### 【パス名展開】
ls ssh・・・・sshという名前のものだけ表示
ls ssh*・・・sshがつくファイルすべてを表示
ls ss?・・・ssから始まって3文字のものだけを取り出せる。

### 【オプション】
-aのような短いものだけでなく、
--quate-name のような長いオプションである、ロングオプションという種類もある。

### 【ls のオプション】
-l 詳細情報を含めて表示 lはlongの略
-F ファイル種別を含める。　ディレクトリとfileを区別できる。bin@ やhome/のように表示

### 【オプションを複数つける場合】
-al, -lF のように続けて書けば良い。

## section4 ファイル操作

### 【mkdir】
-p 親ディレクトリも含んで作成

### 【rm】
rm -r 
r recursive 再帰的な
再帰的にディレクトリを削除する。→ディレクトリ以下すべて削除

### 【cat】
表示するコマンド
concatenate 連結するの略
複数ファイル指定すると、順番に表示するので、concatenateとよばれる

### 【less】
catと同じく表示させるが、スクロール表示させる。
スクロール表示　キーで移動できる
スペースキーなど。
moreコマンドもあるが、こちらはほぼ使わない。(less is more)
lessコマンドには検索機能あり！
/検索したい文字列。
例 /aaa でaaaをlessコマンドで表示しているファイルから検索できる。
nキーで次の検索結果に飛ぶことができる。

### 【cpコマンド】
cp 複数ファイル　dir
コピー元を複数にすることもできる。
ディレクトリをコピーすることも可能。
その場合は、-rが必要。

### 【mv】
mvはディレクトリを移動させるときも、
-rは必要ない。
移動先にディレクトリの名前以外を指定すると、名前の変更になる。

### 【ハードリンクとシンボリックリンク】
・ハードリンク
１つのファイルに複数の名前を付ける機能。
ディレクトリに対して設定できないなど不便な点もあることから、
シンボリックリンクの方がよくつかわれる。
・シンボリックリンク
リンク先のパス名が書かれた小さな特殊ファイル
ハードリンクのように１つのファイルに別名をつけるのではなく、
ファイルを参照するファイルを新しく作る。
あるファイルを参照したいときに、そのファイルを直接指定するか、
そのファイルを参照するファイルを指定するかという2通りの方法があるので、
これは別名をつけているとも解釈できる。
ディレクトリに対しても設定することができる。
用途
・長いパス名の省略（ショートカット）
[dir1/dir2/dir3/file]というパスを別名をつけることで、fileという名前で
呼び出せるようにすれば、パス指定が楽になる。
・別のファイルを同じ名前で呼べるようになるので、呼び出し方を
変更しなくてよくなる。
例.バージョン番号を含んだファイルをlatestといった別名をつけて利用するなど、
こうしておくと、バージョンを変えるときに、
latestのリンク先を新しいバージョンのファイルに変えれば、
呼び出し方は、latestのままに変えずに、
参照するファイルを変えることができるようになる。

### 【ln】
リンクを作成する。
ln file1 file2
でfile1のハードリンクをつくるリンク
ハードリンク：一つのファイルに別名をつける
-sでシンボリックリンク作成
シンボリックリンクは元ファイルが消えたら、参照できなくなる。

## section5　調べるコマンド


### 【help】
--help
復習　オプションには2種類ある
ロングオプション　--help　ハイフン２つ。

### 【man】
helpよりも詳細

### 【history】
過去に利用したコマンドを一覧で出して、
番号を指定すればそれを再利用することができる。
history
19 ls
20 ls dir
のように出るので、420を実行したい場合、
!420　と実行する。


## section6　探すコマンド

### 【find】
find 検索開始ディレクトリ　検索条件　アクション
アクションがprintの場合は省略が可能。
find . -name "*.txt" -print
これは、ワイルドカートで記述されていてOK
パス名展開・・・*や?が複数のファイルのリストに変えて実行する。
find . -name *.txt -print
これは、-nameが複数の引き数をもつことになり不可
find . -type l
type　ファイル種別を選択できる。l link 
複数条件にするには？
ファイル種別がディレクトリで、名前がshare
find . -type d -a -name share
-aで複数条件にできる。and
findの弱点
階層を順々にディレクトリを下っていくので、検索に時間がかかる。
→locateコマンドのほうが高速に処理できる。
locateコマンドでは、検索速度を上げるために、、
あらかじめ、ファイルのデータベースを作る。
→新規作成したファイルをすぐにlocateコマンドで探すことはできない。
データベース化されるのは一日に一回。
sudo updatedbでアップデートできる
locateのand検索
locate bash -A doc
locateのor検索
locate bash doc

### 【grep】
ファイルの中から、特定の文字列が含まれる行だけを検索
grepはglobal regular expression print
global・・・ファイル全体
regular expression 正規表現
grep bin /etc/crontab
正規表現を使わずに文字列を検索することもでき、
その場合は、 grep 検索文字列 検索するファイル
というように書く

## section7　パーミッション

### 【オーナー】
ファイルの所有者のこと。ファイルのオーナーはファイルへのアクセス権限を自由に変更できる。

### 【グループ】
ユーザーをまとめた集まりのこと。
グループ単位でファイルへのアクセス権限を設定することができる。
例えば、システム管理を行うユーザーをwheelグループに所属させたうえで、
wheelグループに権限を付与することで、システム管理者にまとめて権限を与えられるようになる。

### 【パーミッション】
r read
w write
x execute
-rwxr-xr-x
オーナ　グループ　その他ユーザー　の順
最初の-は、ファイルであることを示す。
dだとディレクトリを示す。
lだとシンボリックリンクを表す。
ディレクトリにおけるrwxの意味
r:ディレクトリに含まれるファイル一覧の取得
w:ディレクトリの下にあるファイルディレクトリの作成削除
x:ディレクトリをカレントディレクトリにする。

### 【パーミッションの変更(シンボルモード)】
chmod change mode
数値モード、シンボルモードがある。
シンボルモード　誰に何をどうするかを指定する
誰に：u（オーナー）g(グループ）o（その他のユーザー） a(ugoすべて）
何を:r w x
どうする +(権限の追加）　-(権限の削除）=(指定した権限と等しくする)
o+w →その他のユーザーに書き込みを追加
go-x→グループに所属するユーザーとその他のユーザーoから実行権限を削除する
o=rw→その他のユーザー(o)の権限をrw-にする。
シンボルモードは、オーナーには実行権限、その他のユーザーには削除、
のように書く際は、不便

### 【パーミッションの変更(数値モード)】
r 4
w 2
x 1
というように数値を割り振ることで、
rwx 4+2+1=7
r-x 4+1=5
というようにパーミッションを数字で表現できる。
755 rwxr-xr-x
744 rwxr--r--
321 -wx-w---x
chmod 755 file
のように書く

## section8 スーパーユーザー

### 【スーパーユーザー】
管理者権限をもつ特別なユーザーのこと
ユーザー名がrootであることから、rootユーザーとも呼ばれる。
スーパーユーザーはファイルのパーミッションの影響をうけずに、
すべてのファイルに対し読み込み、書き込み、実行が可能。

### 【su】
su
スーパーユーザーに変更するコマンド
スーパーユーザーのときは、プロンプトの右端に$マークではなく、
#マークが表示される。
exitで、superユーザーから一般ユーザーに戻れる。
su substitute user の略。

### 【sudo】
substitute user do
sudo 実行したいコマンド
と書くことで、コマンドをスーパーユーザーとしても実行できる。
sudoもsuと同様に、本来はユーザーを切り替えて、コマンドを実行するためのコマンドだが、
主にスーパーユーザーとして実行するために使われる。
注意
sudo　実行したいコマンドと書くと、
現在ログインしているしているユーザーのパスワードが求められる。
(suの場合はrootユーザーのパスワード)
sudo をメインで使うと良い。

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

### 【標準出力とは】
各コマンドは、「キーボードから入力されている」とか
「ディスプレイに出力する」とは考えておらず、シンプルに
「標準入力から入力し、標準出力に出力する」だけ。
「標準入力はキーボード、標準出力はディスプレイ、標準エラー出力はファイル」
というように、標準入出力をどこに繋ぐかは、ユーザーが自由に設定できる。
もし「キーボードから入力」とか「ディスプレイに出力」というように、
入出力先が固定されていると、出力をディスプレイからファイルに変えたとき、
コマンドの内容を変更しなければならなくなってしまう。
特定の入出力先に依存させるのではなく、「標準出力から入力し、標準出力に出力する」
という標準入出力を土台にして、入出力を自由に切り替えられるようなインターフェースに
することで、コマンドの内容を変更しなくてもいいようにしている。

### 【リダイレクト】
lsとやると表示される。これは、標準出力がディスプレイになっている。
これを他のところに出力させるのが、リダイレクト。
・標準出力
ls > ls.txt
標準出力がtxtに変わるので、ディスプレイには何も表示されない。
・標準入力
< 標準入力を変える。
cat < /etc/crontab
catの入力をcrontabに変える。
・標準エラー出力
cat 存在しないファイル.txt
cat:file: そのようなファイルやディレクトリはありません。
このエラー文が、標準エラー出力。
cat 存在しないファイル.txt file 2>error.txt
これで、標準エラー出力が、ディスプレイではなく、error.txtに保存される。

### 【リダイレクトまとめ】
< file : 標準入力をfileに変更
\> file : 標準出力をfileに変更
2 > file : 標準エラー出力をfileに変更
\>> file : 標準出力の出力をfileの末尾に追記
2>> file : 標準エラー出力の出力をfileの末尾に追記
\>file 2>&1 :標準出力と標準エラー出力をfileに変更

### 【リダイレクトの活用】
リダイレクトの重要な活用方法。
標準出力が不要で、標準エラー出力だけ出したい場合。
cat /etc/crontab file > /dev/null
これで、標準エラー出力だけ出せる。
dev/nullはスペシャルファイルと呼ばれる特殊なファイルで、
以下のような性質をもつ
・入力先に指定すると、何もデータを返さない
・出力先に指定すると、書き込まれたデータをすべて破棄する
このような性質から、 /dev/null は以下の用途で使用される
・エラーメッセージだけを表示したい(> /dev/null)
・エラーメッセージを非表示にしたい(2> /dev/null)

### 【パイプ】
一つ目のコマンドの標準出力を、2つ目のコマンドの標準入力に繋げる。


## section10 テキスト処理

### 【フィルタとは】
標準入力を入力として受け取り、標準出力に出力するコマンドのこと。
入力をそのまま出力するcatコマンドや、入力の先頭部分だけを表示するheadコマンドなど
たくさんのフィルタがlinuxには存在している。
フィルタのひとつひとつはごく簡単な機能しかないが、フィルタをパイプラインで繋ぐことで、
複雑な操作ができる。
hisrtory | head

### 【wc】
文字数を数える　word countの略
wc -l 行数を数える
wc -w 単語数を数える

### 【sort】
アルファベット順に並べ替える
sort -n 数字順に並べ替え
-r 逆順に並べ替え

### 【uniq】
連続する重複行を取り除ける。
そのため、sortコマンドで並べ替えたうえで削除することが必要。
uniq -c 重複回数を数える
uniq |sort -nr
で重複回数が多い順に並べ替えられる。

### 【head tail】
head -n 3 先頭3行を表示
tail -n 3 末尾3行を表示
引き数なしなら先頭、末尾10行

### 【tail -f】
tail -f
で、ファイルの変更を監視できる。

## ラスト　section11 プロセスとジョブ


### 【Linuxとマルチタスク】
複数のことを同時に実行する。
当たり前の機能だが、リナックスにもこの機能は備わっている。

### 【プロセス】
プロセスとは？
メモリ上で実行状態にあるプログラムのこと。
コマンドの実態はディスク上に保存されたファイルであり、シェルからコマンドを実行すると、
Linuxカーネルはディスクからコマンドのファイルを読みだして、メモリに格納する。
そのメモリに格納された内容に従って、CPUがプログラムを実行する。
ここでメモリ上で実行状態にあるプログラムのことをプロセスという。
Linuxカーネルから見たときの処理の単位ともいえる。

### 【ジョブ】
シェルのコマンドラインに入力している１つの行のこと。
シェルから見た処理の単位、とも言える。
コマンドが一つだけの場合、プロセスとジョブは同じ数（１つ
）になる。
一方で、パイプラインにより2つ以上のコマンドを組み合わせると、
ジョブは１つだが、プロセスはコマンドの数だけ生成される。

### 【ps】
プロセスの状態を示す。
PID process id
TTY どのターミナルで実行したのかを表す
BSDオプション・・・オプションの前に-がつかないもの。
x: 別のターミナルやデーモンを含めたすべてのプロセスを表示
a:すべてのユーザーのプロセスを表示
u:詳細情報も含めてプロセスを表示
デーモン
コンピュータ上で常時起動されている、特定の処理を行うプロセスのこと
例.　webサーバーはいつでもHTTPリクエストを処理できるように、
httpd(HTTPデーモン)というプロセスを常時動かしている
デーモンをpsすると、TTYが?になる。
デーモンはターミナル上で稼働しているわけではないので。
TTY pts/0　一つ目のタブ　pts/1 2つ目のタブ

### 【jobs】
sleep 指定した秒数、実行を停止させるコマンド
ctrl + z でsleepを一時停止できる
→ジョブの一次停止
二つジョブを停止させて、
jobsコマンド実行すると、二つのジョブが表示される。
プロセスIDとの違い
→ターミナルのタブごとにジョブIDは振られるので、
ジョブIDの重複はあり得る。
-l より詳しい説明になる。

### 【fg】
フォアグラウンド
・・・ユーザーと対話的に操作できる状態で実行されている状態
バックグラウンド
・・・裏側で実行されている。
これらプラス停止の3つの状態を切り替えることができる。
以下で見ていく。
停止から、フォアグラウンドへ
fg %2
現在停止状態のジョブ番号2のジョブが実行できる。

### 【bg】
bd %1
ジョブ番号1のジョブをバックグラウンドで実行できる。

### 【プロセスやジョブを終了させる】
フォアグラウンドのジョブはctrl + c で停止できる。
sleep 1000 &
&を最後につけると、最初からバックグラウンドで実行される。
バックグラウンドジョブは、
kill %1
というように終了させる。
kill process id でもOK
例. kill 7806

### 【killコマンドとシグナル】
killコマンドは終了させるだけじゃない！
シグナルを送信するコマンド
kill -l
killコマンドで、送信できるシグナルを確認できる。
kill -TERM 8845
kill -lで出てきたsignalのSIGは省略できる。上の例なら、SIGTERM
一次停止のシグナル
kill -TSTP 8914
ユースケース
・ふつうのkillで消せない。強制終了する。
kill -SIGKILL 8914
kill -9 8914

# 引用元
https://www.udemy.com/course/linux100test/

# その他
・2年前のメモですが、改めて見直すと学びがある。

・専門用語を覚えるのは大事。

・今はこのUdemy講座も項目や講座内容など多少変わっているようでした。
進化していてすごい。

・似たようなまとめをしているサイトが他にもありました。

https://yukihaga.hatenablog.com/entry/2022/11/11/235012