Linuxコマンドのお勉強 (1)超基礎編

もう一度超基礎からおさらいしましょう！
# Linux commands(SuperBasic)
## ファイル操作の基本
#### `ls`
* `ls -F`
    - ファイル種別の表示
        - なし: 通常ファイル，Dir: /, 実行可能ファイル: *，シンボリックリンク: @
* `ls -w (引数)`
    - 指定した(引数)の数値で横幅を表示する
    
#### `mkdir`
* `mkdir -p`
    - 存在しない親Dirも含めてDirを作成する
    
#### `touch`
* `touch (ファイル名)`
    - (ファイル名)のファイルを作成する(複数指定する事も可能)
    
#### `rm`
* `rm -i (ファイル名)`
    - (ファイル名)の削除確認を行う
    
#### `less [option] (FileName)`
`(FileName)`の内容を1画面ごとに表示して、上下にスクロールすることができる

* `less`コマンドのスクロール操作
    - space, f, ctrl + v: 1画面下にスクロール
    - b: 1画面上にスクロール
    - j, ctrl + n, enter: 1行下にスクロール
    - k, ctrl + p: 1行上にスクロール
    - q: `less`コマンドを終了
* ファイル内の検索: ファイル表示中に"/"を押す
    - /(文字列): 下方向に向かって検索
    - ?(文字列): 上方向に向かって検索
    - n: 次の検索結果に移動
    - N: 前の検索結果に移動

#### `ln [option] (リンク元FileName) (LinkName)`
* `ln (リンク元FileName) (LinkName)`
    - ハードリンク(1つのファイルの実体に複数の名前をつける機能)
    - ハードリンクの削除はハードリンクファイルを`rm`で削除すれば良い
* `ln -s (リンク元FileName) (LinkName)`
    - シンボリックリンク(Winで言うショートカット)
    - シンボリックリンクの削除はシンボリックリンクファイルを`rm`で削除すれば良い
    - 利用法
        - `$ ln -s local/work/code/projiect/source source`などとして長いパス名を省略できる
        - 複数バージョンのプログラムを共存させる

## 探す、調べる
#### `find <検索用Dir> <検索条件 + ファイル名(Dir名)> <Action>`
* `find . -name sample.txt -print`
    - <検索用Dir>: `.` = カレントDir
    - <検索条件>: `-name`: ファイル名の大文字小文字区別，`-iname`: 区別なし
    - <Action>: `-print`: パス名を表示するアクション(なければ`-print`が指定されたとみなされる
* `find . -name '*.txt' -print`
    - <検索條件>: `*`や`?` を使用する際はシングルクォートを必ずつける
* `find . -name sample.txt (-a) file.txt -print`
    - <検索条件>: 検索条件に複数のファイルを指定するとき`-a`をつける(なくてもOK)
* `find . -type d -print`
    - <検索条件>:
        - `-type d`: Dir
        - `-type f`: 通常ファイル
        - `-type l`: シンボリックリンク
        
#### `locate [option] <検索パターン>`
ファイル名DBからファイルを探す( `find`に比べ高速で実行できる)。デフォルトでは入っていないこともあるので`sudo yum install mlodate`でインストール。またインストール直後はファイルパス一覧がDBに登録されていないので、`sudo updatedb`を実行する必要あり(これ以降定期的に`updatedb`は実行されDBが更新される。
* `locate -i(--ignore-case) sample`
    - `-i`: 大文字小文字を区別せず`sample`というファイル及びDirを検索
* `locate -b(--basename) sample`
    - `-b`: 検索対象をファイル名だけにする
* `locate sampleA sampleB`
    - 複数のファイルを指定する場合は、OR検索になる
* `locate -A sampleA sampleB`
    - `-A`: 複数ファイル検索時全てを含みたい場合(AND検索)
    
#### `man`
* `man -k <キーワード>`
* `man <セクション番号> <名前>`
    - `man 5 crontab`
    - `man crontab`: crontab(1), crontab(5)があるのでセクション番号の小さいcrontab(1)が返される
    
* `man -wa crontab` : `-wa`でどのセクションか確認できる(以下に例)

```
$ man -wa crontab
/usr/share/man/man1/crontab.1
/Library/Developer/CommandLineTools/SDKs/MacOSX10.13.sdk/usr/share/man/man1/crontab.1
/usr/share/man/man5/crontab.5
/Library/Developer/CommandLineTools/SDKs/MacOSX10.13.sdk/usr/share/man/man5/crontab.5
```

#### `which [option] <CommandName>`
指定されたコマンド名をサーチパス(パス，`$PATH`で設定るコマンドを探すディレクトリのこと)から探して、見つかった実行ファイルのフルパスを表示する(以下に例)

```
$ which cat
/bin/cat
```

*  `which -a lsmod`: `-a`により全てのサーチパス(ユーザのみでない)から検索可能

## FilePermission
#### `chmod [ugoa] [+-=] [rwx] <FilName>`
* `[ugoa]`:
    - `u`: owner
    - `g`: group
    - `o`: other
    - `a`: all(ugo)
* `[+-=]`:
    - `+`: 権限を追加
    - `-`: 権限を禁止
    - `=`: 指定した権限と等しくする (`chmod go=r sample.txt`: sample.txtに対し，Group及びOtherは読み取りのみ可能となった。`-rw-r--r--`ということ)

#### `chmod [8進数の数値] <FileName>`
* `[8進数の数値]`:
    - r = 4
    - w = 2
    - x = 1

# bashの設定
## alias
#### 設定
`alias <commandName>='<command>'`
(ex) `alias ls='ls -a'`
#### 確認
`type <commandName>`
#### 削除
`unalias <commandName>`
#### 一時無効化
1. フルパス指定: `/bin/ls`
2. commandを使う: `command ls`
3. \をつける: `\ls`

## Option
1つ1つの機能ごとにON/OFFのいずれかの値をとり、これらによりbashの機能を有効/無効化できる。`set`と`shopt`で指定するものが異なるので注意。

#### `set -o(ON)/+o(OFF) <OptionName>`
* `<OptionName>`
    - `ignoreeof`: Ctrl + Dでもshellを終了しない
    - `noclobber`: 既存のファイルをリダイレクトで上書きしない
    - `noglob`: パス名天海を無効にする(\*などはshellに解釈されず、そのまま\*として扱われる)
    
#### `shopt -s(ON)/-u(OFF) <OptionName>`
* `<OptionName>`
- `autocd`: Dir名のコマンドを実行すると、それがcdコマンドの引数に指定されたものとして実行される
- `dotglob`: *や?を使ったパス名展開の結果に、.で始まるファイルも含める
- `cdspell`: cdコマンド実行時、Dirのちょっとしたミスタイプが自動修正される
- `globstar`: パス名展開で**というパターンをつかうと、サブDirまで含めた全てのファイルにマッチする
- `histappend`: bash終了時、履歴ファイルにコマンド履歴を追記し、上書きさせない

## Shell変数(bash内部の変数)
#### 基本形は`<変数名>=<値>`(=の左右にスペースなし)
(ex)

```
$ var='sample test`
$ echo $var
sample test
```

#### PS1 - プロンプト設定
Shellのプロンプト設定には`PS1`に`$ PS1='bash> '`のように文字列を設定する。
利用できる記号は以下

* `\d`: 曜日 月 日という形式の日付
* `\h`: ホスト名の内、最初の.までの部分
* `\H`: ホスト名
* `\n`: 改行
* `\t`: HH:MM:SS形式の現在時刻
* `\u`: ユーザー名
* `\w`: カレントディレクトリ
* `\W`: カレントディレクトリの末尾のDir名
* `\$`: rootユーザの場合は#，それ以外の場合は$
* `\\`: \そのもの

#### PATH - コマンド検索パス
個別にインストールしたAppや自分で作成した独自のDirをコマンド検索パスに含めたいときは，PATH変数の値を変えることで、コマンドをフルパスで実行する必要がなくなる。自コマンドは`~/bin`に入れておくと良い。以下のように設定することで`~/bin`をコマンド検索パスの最後に追加できる。

`PATH="$PATH: ~/bin`

#### LANG - ロケール
bashのエラーメッセージなどは言語や国，地域などと特定するための(インストール時に設定されている)識別子であるLocaleで決まる

* `echo $LANG`: ロケールの表示
* `locale -a`: システムで利用可能なロケール一覧
* `LANG=en_US.UTF-8`: アメリカ英語環境にロケール変更

#### Other shell variables
* `HISTFILE`: CLI履歴を保存するファイル名(デフォルトは`~/.bash_history`)
* `HISTFILESIZE`: 履歴ファイルに保存するCLI履歴の最大行数(デフォルトは500)
* `HISTSIZE`: CLI履歴を保存する最大行数(デフォルトは500)
* `HOME`: ホームDir
* `SHELL`: ログインシェルのパス
* `PWD`: カレントDir

#### 環境変数
* `printenv`: 現在Shellに設定されている環境変数の表示
* `export <shellVariableName>`: 環境変数を自分で設定する
(ex) `$ export LESS='--no-init'`

# プロセスとジョブ
## プロセス
#### `ps`
* `ps`: 現在のTerminalで実行しているプロセスを表示
* `ps x`: psコマンドを実行したユーザーのプロセスを全て表示
* `ps ax`: psコマンドを実行したユーザーのプロセス全てを詳細情報を合わせて表示
* `ps aux`: 全てのユーザーのプロセスを、詳細情報を合わせて表示
* `ps auxww`: `aux`オプションで，コマンドラインが長くターミナルの右端が切れてしまう場合に，表示幅を制限せず全て表示

## ジョブ
#### `jobs`
* `jobs`: 現在のジョブの一覧を表示
* `jobs -l`: ジョブ一覧にプロセスも表示

#### `fg %<ジョブ番号>`
* `fg`: 現在のジョブをフォアグラウンドにする
* `fg %<ジョブ番号>`: 指定したジョブ番号をフォアグラウンドにする

#### `bg %<ジョブ番号>`
* `bg`: 現在のジョブをフォアグラウンドにする
* `bg %<ジョブ番号>`: 指定したジョブ番号をフォアグラウンドにする

(ex.)

```
$ man bash
(Ctrl+z)[1]+  Stopped                 man bash

$ vim .bashrc
(Ctrl+z)[2]-  Stopped                 vim .bashrc

$ jobs
[1]+  Stopped                 man bash
[2]-  Stopped                 vim .bashrc

$ bg %2
[2]- vim .bashrc &

$ fg %2
```
## `kill`
* `kill %<ジョブ番号>`: ジョブを終了させる(ジョブに対しSIGTERMを送る)
* `kill <PID番号>`: プロセスを終了させる(プロセスに対しSIGTERMを送る)
* `kill -<Signal / Singal番号> <PID番号>`: プロセスに対しSignal/Signal番号を送る
* `kill -l`: シグナルの表示

(ex)

```
$ kill -l
1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL
5) SIGTRAP     6) SIGABRT     7) SIGEMT     8) SIGFPE
9) SIGKILL    10) SIGBUS    11) SIGSEGV    12) SIGSYS
13) SIGPIPE    14) SIGALRM    15) SIGTERM    16) SIGURG
17) SIGSTOP    18) SIGTSTP    19) SIGCONT    20) SIGCHLD
21) SIGTTIN    22) SIGTTOU    23) SIGIO    24) SIGXCPU
25) SIGXFSZ    26) SIGVTALRM    27) SIGPROF    28) SIGWINCH
29) SIGINFO    30) SIGUSR1    31) SIGUSR2
```
Ctrl + z = 18. SIGTSTP, Ctrl + c = 2. SIGINT
9. SIGKILLはプロセスに渡されず直接カーネルが処理し、強制終了する