【学習】Linuxコマンド　Day11

# おさらい
前回まで学習したことはこちらです。

- 環境構築 
　→https://qiita.com/imagatasaki/items/4c510cacc6f17556c3b9
- コマンドラインの操作方
- 基本的なコマンド① 
　→https://qiita.com/imagatasaki/items/37a7c12bce015d6bdc4a

- 基本的なコマンド②(ファイル操作)
　→https://qiita.com/imagatasaki/items/7abc96b0afea475077a2
　→https://qiita.com/imagatasaki/items/6ccf0e1cd44ebe1d3e9b
- パーミッション
- スーパーユーザー
　→https://qiita.com/imagatasaki/items/39e081d9c10c1448e0c7
- Vim
  →https://qiita.com/imagatasaki/items/f4302837756102d0d430
- リダイレクト
- パイプライン
  →https://qiita.com/imagatasaki/items/cfc37493ad95ee82c48d
- プロセス
- ジョブ
  →https://qiita.com/imagatasaki/items/aceeffcb5d474bd72b65
- フォアグラウンドジョブ、バックグラウンドジョブ
  →https://qiita.com/imagatasaki/items/0c3afec4d2caebd2ef03

# 今日学ぶこと
- エイリアス
- コマンドの種類
- シェル変数
- 環境変数

# エイリアスとは
エイリアスはコマンドに別名をつける機能。使用することで長いコマンドも短く書くことが可能となる
### エイリアスを設定する(aliasコマンド)
例えばパイプラインでつないだ長いコマンドを短く設定してみる。
例:/etc/shellsをcatで行番号付きで表示する
```
$ alias catn = 'cat /etc/shells | nl'
$ catn
1 /bin/sh
2 /bin/bash
3 /usr/bin/sh
4 /usr/bin/bash
```
このようにパイプラインでつないだ長いコマンドが"catn"と入力するだけで再現可能となる。

### 設定されているエイリアスを確認する(aliasコマンド)
引数を指定せずaliasコマンドを実行すると確認できる。
```
$ alias
alias catn='cat /etc/shells | nl'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only -read-alias --show-dot --show-tilde'
```

# コマンドの種類
コマンドには大きく分けて3種類存在する。
- エイリアス→コマンドの別名
- 組み込みコマンド→シェルに内蔵されているコマンド
- 外部コマンド→シェルの外部にファイルとして用意されているコマンド

typeコマンドを使用するとコマンドの種類が確認できる。

### コマンドの種類を確認(typeコマンド)
例えば上記で設定した"catn"を調べる。
```
$ type catn
catn is aliased to 'cat /etc/shells | nl'
```
catnがエイリアスであることが確認できた。
それではpwdコマンドはどうか。
```
$type pwd
pwd is a shell builtin
```
"builtin"とは日本語で"内蔵"を指す。よって組み込みコマンドであることがわかる。
それではtouchコマンドはどうか。
```
$type touch
touch is /bin/touch
```
ファイルの絶対パス名が出てきた雨に外部にファイルとして用意されていることが確認できる。

### 優先度
同名のコマンドが複数存在した場合、どのコマンドが実行されるか。
実行の優先度はエイリアス>組み込みコマンド>外部コマンドの順に高い。
そのため優先度が高いものが選ばれて実行される。

### エイリアスの削除(unaliasコマンド)
削除を行う場合はunaliasコマンドを使用する。
```
$ unalias catn
$ catn
-bash: catn: command not found
```

# シェル変数
シェル変数とはシェルが持つ変数で、文字列、数値などを保存する機能。
どのような値を入れるかにとってシェルの振舞などの設定を変更できる。
デフォルトで用意されているシェル変数も存在する。

### 定義と参照
例:testという変数にabcという文字列を代入する。
```
$ test=abc
$ echo $test
abc
```
"="で代入を行い、echoで参照する。変数名の頭に"$"をつける。

### 一覧表示から検索する(setコマンド,grepコマンド)
setコマンドを使用すると既存のシェル変数が全て一覧で表示されるが、出力結果が長いので今回は割愛。
grepコマンドをパイプラインでつないで上記のtestという変数を検索してみる。
```
$ set | grep test
test=abc
```

# 環境変数
環境変数はシェル変数の一部で、子プロセスに値が受け継がれる変数を指す。
psコマンドのfコマンドでまずは親子関係を確認する。
```
$ ps -f
  PID TTY     STAT   TIME COMMAND
1610  tty1    S      0:00 -bash
1924  tty1    R+     0:00  \_ ps f
1498  tty1    Ss     0:00  -bash
```
新たにbashコマンドを実行してbashプロセスを起動する。
```
$ ps -f
  PID TTY     STAT   TIME COMMAND
1610  tty1    S      0:00 -bash
1925  tty1    S      0:00  \_ bash
1940  tty1    R+     0:00  　　\_ ps f
1498  tty1    Ss     0:00  -bash
```
新たなbashプロセスに切り替わったことが確認できた。
この状態でシェル変数testを参照してみると
```
$ echo $test

```
何も表示されない。
これはシェル変数が子プロセスには受け継がれないため。
子プロセスが受け継ぐためには環境変数として定義する必要がある。

### 環境変数の定義(exportコマンド)
exportコマンドを使用すると環境変数を新たに定義することができる。
このコマンドは引数に指定したシェル変数を環境変数として定義する。
```
$ test=abc
$ export test
$ bash
$ test
abc
```
exportコマンドで環境変数となり、あらたなbashプロセスに切り替わった後でも"abc"と表示されることがわかる。
ただし、環境変数を定義したプロセスの親プロセスでは使用することはできないので注意。

### ロケール
ロケールは国や地域の設定を指す。代表的な環境変数の一つ。
まずは現在のロケールを表示してみる。
```
$ echo $LANG
en_US.UTF-8
```
現在は英語が設定されている。
ロケールを日本語に変更してみる。
```
$ LANG=ja_JP.UTF-8
```

### 環境変数PATH
シェルはPATHに記載されているディレクトリのパスからコマンドを探す。
記載されているディレクトリのパスを表示してみる。
```
$ echo $PATH
/usr/local/bin:/usr/bin/:/usr/local/sbin:/usr/sbin:/home/masaki/.local/bin:/
home/masaki/bin
```
「:」で区切られて複数記載がされていることが確認できた。
この中から外部コマンドを実行する際にコマンドを探し出していることとなる。
新しいパスを追加する場合は PATH=$PATH:追加するパスと書いて実行することで絶対パスを指定することなく、新たなコマンドを呼び出すことが可能となる。

# おつかれまでした
気が付くと10回分以上の記事を書いてきました。
技術力・知識共にまだまだですがLinuxが日常に溶け込んできた気がします。
そして今回は特に変数の部分に関してはプログラミングには少々慣れがあるからか、シェル変数、環境変数共に抵抗なくスムーズに理解ができました。
ただこれらが具体的にどのように活かされていくかははっきりとはわからなかったのですが、今後も様々な教材で学習していく中で触れていったり、実践の中でさらに理解を深めていきたいです。