【技術書まとめ】新しいLinuxの教科書

- シェル
    - カーネルのインタフェース
        - `date`なら`/usr/bin/date`を探す
    - なぜシェルがあるのか
        - シェルだけ変更できる
        - OSが違っても操作できる
        - エラー時にカーネルの影響を減らす
- 「1つのプログラムには、1つのことをうまくやらせる」
    - 「小さなコマンドを組み合わせて複雑な処理ができる」
- ターミナル
    - ユーザがコンピュータへ入出力するときに使うハードウェア
        - エミュレータが使われている
            - 入出力の画面があるだけ
- コマンドラインの編集
    - Esc 押してから b で単語1つぶん移動
    - Ctrl + h で１文字削除
    - Ctrl + w で1単語削除
    - Ctrl + y で最後に削除した内容を挿入
- トラブル時
    - Ctrl + s
        - 画面表示のロック
    - Ctrl + q
        - ロック解除
    - Ctrl + l
        - 画面を消去する
- コマンド履歴
    - Ctrl + p
        - 1つ前のコマンド
    - Ctrl + n
        - 次のコマンド
- インクリメンタルサーチ
    - Esc
        - 検索結果を残したままコマンドラインに戻る
    - Ctrl + g
        - 検索結果を破棄
- Linux では全てがファイル
- Linux はシステム全体で1つのディレクトリツリーのみ
- Linux のディレクトリ
    - FHS（Filesystem Hierarchy Standard）
        - /bin
            - Linuxシステムの動作に最低限必要なコマンド
        - /dev
            - デバイスファイルを格納する
        - /etc
            - 設定ファイル
        - /home
            - ユーザごとに割り当てられる
        - /sbin
            - 管理者ユーザ向けコマンド
                - shutdownなど
        - /tmp
            - 一時ファイル
        - /usr
            - 各種アプリと付属ファイル
                - 下に bin,sbin,etc などを持つ
        - /var
            - 変化するデータを置く
                - ログや電子メール
- コマンド
    - touch
        - 既存ファイルがあっても上書きされない
    - cat
        - 引数なし
            - キーボードからの入力を待つ
    - less
        - ファイルを1画面で見る
            - `/etc`,`?etc`で検索できる
                - `n`で次の検索結果へ
    - `mv file1 file2`でファイル名変更する
    - `ln -s file1 file2`でシンボリックリンクをつける
        - 活用法
            - 深すぎるファイルにつける
            - バージョンに`latest`のリンクをつける
- 探す
    - `find . -name file-1.txt -print`
        - カレントから下りながら探してパスを表示する
            - `-iname`
                - 大文字小文字区別しない
            - ワイルドカードを使うときは`''`を使う
                - パス名展開されてしまうから
            - `-type d`でディレクトリに絞りこむ
                - `f`は通常ファイル
                - `l`はシンボリックリンク
    - `locate`
        - 作成してしばらくたったファイルの検索
            - `locate -b python`で名前を含むファイルを検索できる
                - ディレクトリは表示されない
            - 複数入れるとOR検索になる
            - AND検索は`-A`を入れる
- Vim
    - コマンド入力ができない時
        - Escを何度か押す
    - 保存せず終了
        - `:q!`
    - 単語一つ分移動する
        - `w`
        - `b`
    - 行頭へは`0`
    - 行末へは`$`
    - `gg`で冒頭
    - `G`で末尾
        - `o`で次の行から編集する
    - カットやコピーペースト
        - カットは`d`と範囲を指定
        - ヤンクは`y`と範囲を指定
        - `p`でプット
    - アンドゥは`u`
    - リドゥは`Ctrl + r`
- bash
    - エイリアス
        - `alias <名前>='<コマンド>'`
    - シェル変数
        - `var1='test variable'`
            - `$var1`で参照できる
            - スペースは入れない
    - 環境変数の設定
        - `export LESS='--no-init'`
            - 以降lessコマンドで`--no-init`が自動で付くようになる
    - カスタマイズ
        - `~/.bashrc`に書く
        - `source ~/.bashrc`で即時反映
    - コメントは`#`
- ファイルのパーミッション
    - `-`は通常ファイル、`d`はディレクトリ、`l`はシンボリックリンク
    - `rwxr-xr-x`などの9文字はオーナー、グループ、その他のユーザのパーミッション
    - chmod
        - シンボルモード
            - `chmod u+w file.txt`
                - `u`はオーナー、`g`グループ、`o`その他のユーザ、`a`ugoすべて
                - `+`権限を追加、`-`禁止する、`=`指定した権限と等しくする
                    - `chmod go=r file.txt`
        - 数値モード
            - `4`は読み取り(r)、`2`は書き込み(w)、`1`は実行(x)
                - `chmod 755 file.txt`
                    - 各行はオーナー、グループ、その他の足し算になっている
- 環境変数を引き継がないでスーパーユーザになる
    - `su -`
- `ps aus`
    - すべての実行プロセス確認する
    - `kill <PID>`で止める
        - 終了できるのは実行ユーザのみ
        - 本当はシグナルを送信するコマンド
- 途中で止めたい時
    - Ctr + z
- リダイレクトとは
    - 標準入出力先を変更する機能
        - 入力リダイレクト
            - `cat < /etc/crontab`
        - 出力リダイレクト
            - `ls -l / > list.txt`
                - 標準出力先が`list.txt`になる
    - `>>`と書くことで追記になる
        - 上書きしない
    - 出力を捨てたいとき
        - `cat /etc/crontab > /dev/null`
        - `ls / /xxxx 2> /dev/null`
            - エラー`2`は捨てて通常出力だけを見たいとき
        - 標準もエラーも捨てる
            - `ls / /xxxx > /dev/null 2>&1`
- ファイルの頭だけ表示する
    - `head /etc/crontab`
- 出現回数ランキング作成する
    - `sort file1 | uniq -c | sort -rn`
- 正規表現
    - `grep 'mail[1-4] example.txt'`
        - 1-4 にマッチ
        - `[^13]`は1か3以外
        - `grep '^B[ea]*r$' drink.txt`などもできる
    - `.`は任意の１文字
    - `'^net'`は頭がnet
    - `'net$'`は終わりがnet
    - `'Be*r'`は0回以上の繰り返し
- 拡張正規表現
    - `grep -E 'Be+r' drink.txt`
    - 郵便番号の3桁-4桁
        - `[0-9]{3}-[0-9]{4}`
    - ウォッカかワインか
        - `grep -E 'My (Vodka|Wine)' drink.txt`
- sed
    - 削除する
        - `sed 1d drink2.txt`
    - 置換する
        - `sed 's/Beer/Whisky/g' drink2.txt`
- awk
    - ls の出力から5列目と9列目を取り出す
        - `ls -l /usr/bin/ | awk '{print $5,$9}'`
        - 最後の２列を表示する
            - `ls -l /usr/bin/ | awk '{print $(NF-1),$NF}'`
        - ９列目の頭がcpを表示する
            - `ls -l /usr/bin/ | awk '$9~ /^cp/ {print $5,$9}'`
        - csvの最後の列の総和を出す
            - `wk -F, '{sum += $NF} END{print sum}' score.csv`
                - 行数`$NR`で割って平均値を出す
                    - `wk -F, '{sum += $NF} END{print sum}' score.csv`
- シェルスクリプト
    - `#!`シバンを頭に書く
        - `source`で実行でも良い
            - `. ./homesize-noshebang.sh`のドットコマンドでも同じ意味
            - aliasの設定の違いなどで想定しない動作をしたりする
                - ファイル名指定で実行の方がいい
            - `source ./homesize.sh`のように相対パスか絶対パスで書く
                - パス指定がないとサーチパス内からも探してしまうから
    - `;`で繋げられて、`\`で改行できる
    - `$`で変数の値を取得するイメージ
    - `=`前後にはスペースを入れない
    - 使えるのはアルファベットと数値と`_`のみ
    - `""`は変数展開できる
    - `./parameters.sh aaa bbb ccc`
        - `$1, $2, $3`に引数が入る
    - `$#`で引数の個数を取れる
    - `$@`で全ての引数を受け取る
    - `[`はコマンド
        - `if [ "$1" = "bin" ]; then`では`"$1`や`=`が引数となる
            - `[`は引数の条件式を判定するコマンド
                - 正であれば0を、そうでなければ0以外を終了ステータスとして返す
                    - 終了ステータスは`$?`でわかる
                - `test "$1" = "bin"; then`でもほぼ同じ
                - `&&`は終了ステータスが0で正常な時、次のコマンドを実行する
                    - `[ -f file.txt ] && cat file.txt`
    - `$((i + 2))`で計算できる
        - bashの算術式展開
- アーカイブ
    - アーカイブする
        - `tar cf dir1.tar dir1`
            - cfはcreate file
            - ファイル属性もそのままアーカイブされる
                - バックアップにはcpよりもいい
                    - rootで実行する
    - アーカイブできたら内容確認する
        - `tar tf dir1.tar`
    - 展開する
        - `tar xf dir1.tar`
- 圧縮
    - 圧縮する
        - `gzip ps.txt`
    - 展開する
        - `gzip -d ps.txt.gz`
- `tar`と`gzip`を一緒に使う
    - `tar czf dir1.tar.gz dir1`
    - `tar xzf dir1.tar.gz`
- SSH先のディレクトリdir1を`tar+gz`ファイルとして転送する
    - `ssh osumi@serverB 'tar czf - dir1' | tar xzf -`
- `bzip`はより圧縮率が高い
    - `xz`はさらに高い
        - Linuxカーネルなど
- git 
    - `git diff`はワークツリーとインデックスの差分
    - `git diff --cached`はインデックスとリポジトリの差分
    - `git diff HEAD`はワークツリーとリポジトリの差分