【新しいLinuxの教科書】を読んだメモ

# なにこれ

[新しいLinuxの教科書](https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)という本を読んで、自分が知らなかった箇所をメモしたので備忘録として残します。

# 1章
## grepコマンド
参照元 or 参照先から一致するのを取る
grep “gprc” main.go ➡️「grpc」を含む文字列
grep “gprc” main.go | sort ➡️↑の文字列をソートしてる
gem list | grep carrierwave ➡️gem listの表示結果から繋いで、carrierwaveって文字だけを抜き出す

# 2章
## prompt
ohishikaito@localhost $ ➡️この$markより左側

## echo $SHELL
今使ってるshellを確認できる。

```
go $ echo $SHELL
/bin/zsh
```
## シェルの種類
- sh
- -csh
- bash
- tcsh
- zsh

# 3章
## 知らなかったショートカット
### ctrl + B or F 
1文字ずつ移動できる
backward forwardの略

### esc + B or F 
~~単語移動~~
option + 矢印の方が正確に移動できる（矢印キー使うのうざいけど！）

### Ctrl + W
単語削除

### Ctrl + u
**カーソルから行頭まで削除（めっちゃ使いそう！）**
カットとヤンクって言われるらしい

### command + L
ctrl + L で削除したログを復元できた

### ctrl + n
ctrl + P で戻った前のログを見れる（あんま使わんけど）

## おまけ
日本語は色んな文字コードの規格がある
とりあえず「UTF-8」を選んでおけばおっけー

# 4章

## Linuxは全てファイルからできてる

## 各ディレクトリの役割
### bin
重要度の高いコマンドが格納

### dev
デバイスファイルを格納

### etc
通常ファイルを置くため

### home
ホームディレクトリが配置される


### sbin
binと似てるけど、管理者ユーザー向けのコマンドが置かれてる

### tmp 
一時的なファイル（テンポラリファイル）を置くため
永続的な保存先に選ぶな

### usr
各種アプリと、それに付随するファイルを置くため

### var
変化するデータ（variable）を置くため
データやログ、電子メール等が格納される

## チルダ展開
~のこと
「cd ~」でホームに移動するのは、チルダ展開っていうらしい

## lsの「*」と「?」
ls *.rbで.rbのついたファイル➡️ワイルドカード
ls  ls Gem?ileでGemfile➡️1文字置き換え

# 5章

## mkdir

### -p
存在しない階層フォルダも作れる

## rmdir
フォルダ消せる。左から順番に実行

### -i
確認でる

## cat
ファイル連結して表示できる
`cat .ruby-version Gemfile`みたいな

### -n
**行番号**

## less
スクロールできるcat

## cp
### -r
再帰的に実行しないとコピーできん

## ln
ショートカットみたいなリンク作れる。使いみちが謎
`ln -s app/controllers ctrl`でcontrollersへのリンク

# 6章
## find
` find ./app/models -name user.rb`で検索できる
`find ./app/models -name 'produc?.rb'`でワイルドカード使える

### タイプ指定
`find ./app/models -type f -name 'produc?.rb’`
-type f || d || l とかがある

## man
man lsでlsのdocument見れる

## which
which goでgoのPATHが見れる。
which mkでmakeのaliasってのが分かる。すげー優秀

# 7章
## vim
### xキー
文字削除

### w || b 2回押し
単語移動

### 0と$
行頭 or 行末に移動

### 数字➡️shift + g
行番号まで移動
**100 ➡️ shift + g ➡️100行目に移動**

# 8章
## type mk
mkはmakeのエイリアスだよ

## printenv
環境変数の一覧

## 余談
vimに行番号を表示➡️$ vi ~/.vimrc➡️set number

# 9章
## パーミッションの記号の種類

### ファイルのパーミッションの記号と意味
r＝読み取り(read)
w＝書き込み(write)
x＝実行(execute)

### -rw-r--r--
「-」=ファイルタイプ（- か d がある）
rw-＝オーナーがread & weite
r--＝グループ
r—＝その他のユーザ

### ディレクトリのパーミッションの記号と意味
r＝ディレクトリ配下のファイル読み取り
w＝ディレクトリ配下の書き込み（ファイル・ディレクトリの作成＆削除）
x＝実行：ディレクトリをカレントディレクトリにする

### drwxrwxr-x.
d＝ディレクトリ
「.」は分からん！

### 余談
vscodeで権限消したらファイル開けない、
読み取り専用にしたら保存できない、
「上書き」って押したら、パーミッションにwが追加されて保存できた

## chmod
chmod u+w ファイル名

u＝オーナ
g＝グループ
o＝その他のユーザ
a＝ugo全て
**ユーザ指定を省略すると、a+を指定したことになる！**

### 数値モード
4＝r（読み取り）
2＝w（書き込み）
1＝x（実行）
**合計値で分かる**

```
hoge $ chmod 755 fuga
hoge $ ls -l         
-rwxr-xr-x  1 ohishikaido  staff  5  6 16 05:38 fuga
```

# 10章

## プロセス

全てが個別のプロセスIDを持つ
less で閲覧中のファイルがあればプロセスが実行されて、
lessを閉じるとプロセスが消える

## psコマンド

### TTY
ターミナル

### ps ax
全てのプロセス

## jobs
zshだとjobsが見れない？？

## kill
defaultだとkill -15(-TERM)ってのが指定されてる

実行中のvimとかをkillすると、その場で死ぬ

### kill -9
例外プロセスで、linuxが処理する？
強制終了みたいなイメージ

# 11章

stdin 標準入力
stdout 標準出力
sdferr 標準エラー出力

## 標準出力のリダイレクト

```
hoge $ ls -l > fuga 
hoge $ cat fuga 
total 0
-rwxr--r--  1 ohishikaido  staff  0  6 16 06:45 fuga
```
## 標準エラー出力のリダイレクト

```
hoge $ lsdd 2> fuga
hoge $ cat fuga    
zsh: command not found: lsdd
```

## >>
追記できる

```
hoge $ ls -l >> fuga
hoge $ ls -l >> fuga
hoge $ cat fuga     
total 8
-rwxr--r--  1 ohishikaido  staff  149  6 16 06:50 fuga
total 8
-rwxr--r--  1 ohishikaido  staff  212  6 16 06:50 fuga
```

## /dev/null
- スペシャルファイル
- 入力先に指定しても何も返さない
- 書き込んでもデータ保存されず消える

出力を消す例）
```
hoge $ ls > cat /dev/null 
hoge $ 
```

## パイプライン
**標準出力を別のコマンドの標準出力につなぐ**

例）
```
hoge $ history | less
 1058  history| less
```

## フィルタ
grep、sortとかはよく使う

# 12章
## wc

```
go $ wc server.go 
      33      67     771 server.go
```
33＝行数
67＝単語数
771＝バイト数

## ファイル・ディレクトリ数のカウント
隠しファイルに注意（.envとか「.」とか移動用のやつ）

```
go $ ls / | wc -l
      16
```

## sort
並び替え
-n＝数値順、
-r＝逆順

## uniq
重複を取り除く

## tr
置換する
`cat  /etc/passwd | tr a-z A-Z`

## tail
末尾
`tail -n 1 server.go`

-f でファイルへの変更内容を監視＆出力できる

## diff
差分
-uでユニファイド形式ってのが見れる
行基準？みたいな感じで、gitで使ってる表示形式

# 13章

## grep

```
hoge $ grep bash /etc/passwd 
_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
```

### -i
大文字小文字区別なし

```
hoge $ grep system /etc/passwd
# Note that this file is consulted directly only when the system is running
hoge $ grep system -i /etc/passwd
# Note that this file is consulted directly only when the system is running
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
```

### -n
行数表示

### -v
NOT(条件に一致しない奴らを表示)

# 14章

## sed
使うか分からないから流し読み

### 1d
最初の1行を消す

```
hoge $ cat cat 
/dev/null
hoge $ se
```

## awk
切り抜きみたいな。正規表現の楽バージョン？
フィールド変数ってのに代入してる

```
ls -l /usr/bin | awk '{print $5,$9}'
```

# 15章

## シェルスクリプト実行
`./homesize.sh`で実行
カレントディレクトリのshファイルってこと

sourceってつけたら、シェル関係なく実行される？現在のコマンドラインのシェルを使うらしい

# 16章

## 位置パラメータ

```
echo $0 $1

hoge $ ./homesize.sh aadddddd
./homesize.sh aadddddd
```

# 17章

## $#
$0を除く引数の数

例）

```
#!/bin/bash

# hoge=hoge
# echo "aaa $hoge"
# echo aa $(date '+%Y')
# echo $0 $1 $#
# echo $@
# if [ "$1" = "binbin" ]; then
#   echo hoge
# else
#   echo fuga
# fi
# echo $?
# ls ddddddd
# echo $?
# echo $?
# exit 45
# echo $?
# file=$1
# if [ -d "$file" ]; then
#   echo $file
#   ls $file
# else
#   echo $1
# fi
# echo $(seq 1 45)
i=10
echo $((i + 1))
# echo $(i + 1)
```

## シェル関数