Bash


概要

更新日:2019.07.21

Shellとは、Linuxカーネルに対するユーザーインターフェイスを提供するソフトウェアのこと。Shellとは「殻」という意味の単語であり、Linuxカーネルを「殻」で包んで、ユーザーに対して操作を提供しているようなイメージからきているらしい。

BashはShellの一種。Bourne Shellの代替として作成されたので機能を引き継いでいる面がある。

以降のサンプルなどは明示的な説明がない限り以下の環境下での実行結果。

種類

更新日:2019.07.21

Shellはいくつかの種類が存在する。

以下はUnixシェルの一部。

それぞれの違いや、使い方について後で詳しくみていきたい。以降では Bash を使用してそれぞれの説明をしていく。

コマンド

更新日:2019.07.27

コマンドには内部コマンドと外部コマンドに分類される。 type コマンドにより対象のコマンドの分類を確認することが出来る。

内部コマンド

組み込みコマンドはシェルに組み込まれている基本的なコマンド。Bashの内部コマンドは help コマンドより一覧を表示できる。同時に、Bashのバージョンやコマンドの使い方についても簡単な説明を得られる。

[root@centos7-1 ~]# help
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
これらのシェルコマンドは内部で定義されています。`help' と入力して一覧を参照してください。
`help 名前' と入力すると `名前' という関数のより詳しい説明が得られます。
'info bash' を使用するとシェル全般のより詳しい説明が得られます。
`man -k' または info を使用すると一覧にないコマンドのより詳しい説明が得られます。

名前の後にアスタリスク (*) がある場合はそのコマンドが無効になっていることを意味します。

 job_spec [&]                                          history [-c] [-d offset] [n] または history -an>
 (( expression ))                                      if COMMANDS; then COMMANDS; [ elif COMMANDS; then >
 . filename [arguments]                                jobs [-lnprs] [jobspec ...] または jobs -x comm>
 :                                                     kill [-s sigspec | -n signum | -sigspec] pid | job>
 [ arg... ]                                            let 引数 [引数 ...]
 [[ expression ]]                                      local [option] name[=value] ...
 alias [-p] [name[=value] ... ]                        logout [n]
 bg [job_spec ...]                                     mapfile [-n count] [-O origin] [-s count] [-t] [-u>
 bind [-lpvsPVS] [-m keymap] [-f filename] [-q name]>  popd [-n] [+N | -N]
 break [n]                                             printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]                     pushd [-n] [+N | -N | dir]
 caller [expr]                                         pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;].>  read [-ers] [-a array] [-d delim] [-i text] [-n nc>
 cd [-L|[-P [-e]]] [dir]                               readarray [-n count] [-O origin] [-s count] [-t] [>
 command [-pVv] command [arg ...]                      readonly [-aAf] [name[=value] ...] or readonly -p
 compgen [-abcdefgjksuv] [-o option]  [-A action] [->  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [->  select NAME [in WORDS ... ;] do COMMANDS; done
 compopt [-o|+o option] [-DE] [name ...]               set [-abefhkmnptuvxBCHP] [-o option-name] [--] [ar>
 continue [n]                                          shift [n]
 coproc [NAME] command [redirections]                  shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilrtux] [-p] [name[=value] ...]        source filename [arguments]
 dirs [-clpv] [+N] [-N]                                suspend [-f]
 disown [-h] [-ar] [jobspec ...]                       test [expr]
 echo [-neE] [arg ...]                                 time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [name ...]          times
 eval [arg ...]                                        trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [arguments ...]] [red>  true
 exit [n]                                              type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] または export -p>  typeset [-aAfFgilrtux] [-p] name[=value] ...
 false                                                 ulimit [-SHacdefilmnpqrstuvx] [limit]
 fc [-e ename] [-lnr] [first] [last] または fc -s>  umask [-p] [-S] [mode]
 fg [job_spec]                                         unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMANDS; done          unset [-f] [-v] [name ...]
 for (( exp1; exp2; exp3 )); do COMMANDS; done         until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } または name () { CO>  変数 - 変数の名前とその意味
 getopts optstring name [arg]                          wait [id]
 hash [-lr] [-p pathname] [-dt] [name ...]             while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]                             { COMMANDS ; }

外部コマンド

外部コマンドは内部コマンド以外のコマンド群。Shellは外部コマンドを、設定されている PATH と呼ばれる環境変数を元に探して実行する。よくパスを通すなんて言うけど、それはコマンドを PATH に追加する、または PATH に指定されているディレクトリ配下に配置する事を言う。

PATH は以下のコマンドで確認できる。

[root@centos7-1 ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

: は区切りを表しているので、上記は以下のディレクトリが外部コマンドを検索しにいくディレクトリになっている。

試しに /usr/bin の中身を覗いてみた。

[root@centos7-1 ~]# ls /usr/bin
ControlPanel                         gtar                         pwmake
Mail                                 gtbl                         pwscore
VBoxClient                           gtf                          pydoc
VBoxClient-all                       gtk-launch                   pygtk-demo
VBoxControl                          gtk-query-immodules-2.0-64   pyinotify
VGAuthService                        gtk-query-immodules-3.0-64   python
WebKitWebDriver                      gtk-update-icon-cache        python2
X                                    gtroff                       python2.7
Xorg                                 gucharmap                    qemu-ga
Xvnc                                 gunzip                       qemu-img
[                                    gupnp-dlna-info-2.0          qemu-io
a2p                                  gupnp-dlna-ls-profiles-2.0   qemu-nbd
abrt-action-analyze-backtrace        gvfs-cat                     qmi-network
abrt-action-analyze-c                gvfs-copy                    qmicli
abrt-action-analyze-ccpp-local       gvfs-info                    quota
abrt-action-analyze-core             gvfs-less                    quotasync
abrt-action-analyze-oops             gvfs-ls                      ranlib

〜以下略〜

設定ファイル

更新日:2019.07.21

Bashにはいくつかの設定ファイルが存在する。これらの設定ファイルは特定のディレクトリに配置しておけば、起動時に読み込まれBashを初期化することが出来る。

インタラクティブログインシェルとしてBashが起動すると、以下のファイルを順番に読み込む。

  1. /etc/profile ... システム環境特有の設定が記述されている。
  2. ~/.bash_profile ... 個人用の初期化ファイル。
  3. ~/.bash_login ... ログイン時に読み込まれるファイル?
  4. ~/.profile ... 一番最後に読み込まれる個人用初期化ファイル?

非インタラクティブログインシェルとしてBashが起動すると、以下のファイルを読み込む。

~/.bashrc ... 対話シェルごとに実行される、個人用のファイル。

しかし、一般的には ~/.bash_profile には ~/.bashrc が存在するならば読み込むと書かれているので、インタラクティブログインシェルとして起動したとしても ~/.bashrc が読み込まれる。試しに ~/.bash_profile を調べてみると以下のように書いてあった。

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

初期化ファイルがたくさんあるが、基本的には ~/.bashrc に個人用の設定をするでいいらしい。

Bashの変数

更新日:2019.07.27

Bashの変数にはBourne Shellと同様に使えるものと、Bash独自のものが存在する。

一般に、子プロセスに引き継がれるものを環境変数、引き継がれないものをシェル変数と呼ぶ。環境変数は env printenv export -p コマンドで、シェル変数は set コマンドで一覧表示できる。

シェル変数の設定

更新日:2019.07.27

シェル変数の設定は以下の書式で行うことが出来る。注意点は = にスペースを入れないこと。

# OK
変数名=値

# NG
変数名 = 値

シェル変数を使うには以下の書式で行う。

$変数名

# または

${変数名}

シェル変数の削除は unset コマンドで行う。

unset 変数名

例えばこんな感じ。

[root@centos7-1 ~]# NAME=BOOKSTORE
[root@centos7-1 ~]# echo ${NAME}
BOOKSTORE
[root@centos7-1 ~]# echo ${NAME}
BOOKSTORE
[root@centos7-1 ~]# unset NAME
[root@centos7-1 ~]# echo ${NAME}

環境変数の設定

更新日:2019.07.27

環境変数の設定は export コマンドで行う。注意点は環境変数だけを設定することはできず、環境変数は必ずシェル変数として設定されていなければならないこと。

export シェル変数

# または

# シェル変数の設定と、環境変数の設定を同時に行う
export 変数名=値

環境変数を使う方法はシェル変数と同じ。

$変数名

# または

${変数名}

環境変数を削除するには export -n コマンドで行う。

export -n 変数名

例えばこんな感じ。

[root@centos7-1 ~]# export -p | grep FOGE
[root@centos7-1 ~]# export FOGE=ABC
[root@centos7-1 ~]# export -p | grep FOGE
declare -x FOGE="ABC"
[root@centos7-1 ~]# export -n FOGE
[root@centos7-1 ~]# export -p | grep FOGE
[root@centos7-1 ~]# set | grep FOGE
FOGE=ABC

これら変数の設定は永続化されることはなく、Bashを終了すると無くなってしまう。そのため設定ファイルに変数の設定を記述することで、Bash起動時に変数を設定するようにする。

Bashで使われる代表的な変数

更新日:2019.07.27

変数の中にはBashから使用されるものがある。

変数名 内容
PS1 プロンプトの設定
PATH 外部コマンドの検索パス
LANG ロケール
HOME ホームディレクトリ

参考

更新日:2019.07.27