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のバージョンやコマンドの使い方についても簡単な説明を得られる。

  1. [root@centos7-1 ~]# help
  2. GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
  3. これらのシェルコマンドは内部で定義されています。`help' と入力して一覧を参照してください。
  4. `help 名前' と入力すると `名前' という関数のより詳しい説明が得られます。
  5. 'info bash' を使用するとシェル全般のより詳しい説明が得られます。
  6. `man -k' または info を使用すると一覧にないコマンドのより詳しい説明が得られます。
  7.  
  8. 名前の後にアスタリスク (*) がある場合はそのコマンドが無効になっていることを意味します。
  9.  
  10. job_spec [&] history [-c] [-d offset] [n] または history -an>
  11. (( expression )) if COMMANDS; then COMMANDS; [ elif COMMANDS; then >
  12. . filename [arguments] jobs [-lnprs] [jobspec ...] または jobs -x comm>
  13. : kill [-s sigspec | -n signum | -sigspec] pid | job>
  14. [ arg... ] let 引数 [引数 ...]
  15. [[ expression ]] local [option] name[=value] ...
  16. alias [-p] [name[=value] ... ] logout [n]
  17. bg [job_spec ...] mapfile [-n count] [-O origin] [-s count] [-t] [-u>
  18. bind [-lpvsPVS] [-m keymap] [-f filename] [-q name]> popd [-n] [+N | -N]
  19. break [n] printf [-v var] format [arguments]
  20. builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
  21. caller [expr] pwd [-LP]
  22. case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;].> read [-ers] [-a array] [-d delim] [-i text] [-n nc>
  23. cd [-L|[-P [-e]]] [dir] readarray [-n count] [-O origin] [-s count] [-t] [>
  24. command [-pVv] command [arg ...] readonly [-aAf] [name[=value] ...] or readonly -p
  25. compgen [-abcdefgjksuv] [-o option] [-A action] [-> return [n]
  26. complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-> select NAME [in WORDS ... ;] do COMMANDS; done
  27. compopt [-o|+o option] [-DE] [name ...] set [-abefhkmnptuvxBCHP] [-o option-name] [--] [ar>
  28. continue [n] shift [n]
  29. coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...]
  30. declare [-aAfFgilrtux] [-p] [name[=value] ...] source filename [arguments]
  31. dirs [-clpv] [+N] [-N] suspend [-f]
  32. disown [-h] [-ar] [jobspec ...] test [expr]
  33. echo [-neE] [arg ...] time [-p] pipeline
  34. enable [-a] [-dnps] [-f filename] [name ...] times
  35. eval [arg ...] trap [-lp] [[arg] signal_spec ...]
  36. exec [-cl] [-a name] [command [arguments ...]] [red> true
  37. exit [n] type [-afptP] name [name ...]
  38. export [-fn] [name[=value] ...] または export -p> typeset [-aAfFgilrtux] [-p] name[=value] ...
  39. false ulimit [-SHacdefilmnpqrstuvx] [limit]
  40. fc [-e ename] [-lnr] [first] [last] または fc -s> umask [-p] [-S] [mode]
  41. fg [job_spec] unalias [-a] name [name ...]
  42. for NAME [in WORDS ... ] ; do COMMANDS; done unset [-f] [-v] [name ...]
  43. for (( exp1; exp2; exp3 )); do COMMANDS; done until COMMANDS; do COMMANDS; done
  44. function name { COMMANDS ; } または name () { CO> 変数 - 変数の名前とその意味
  45. getopts optstring name [arg] wait [id]
  46. hash [-lr] [-p pathname] [-dt] [name ...] while COMMANDS; do COMMANDS; done
  47. help [-dms] [pattern ...] { COMMANDS ; }

外部コマンド

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

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

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

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

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

  1. [root@centos7-1 ~]# ls /usr/bin
  2. ControlPanel gtar pwmake
  3. Mail gtbl pwscore
  4. VBoxClient gtf pydoc
  5. VBoxClient-all gtk-launch pygtk-demo
  6. VBoxControl gtk-query-immodules-2.0-64 pyinotify
  7. VGAuthService gtk-query-immodules-3.0-64 python
  8. WebKitWebDriver gtk-update-icon-cache python2
  9. X gtroff python2.7
  10. Xorg gucharmap qemu-ga
  11. Xvnc gunzip qemu-img
  12. [ gupnp-dlna-info-2.0 qemu-io
  13. a2p gupnp-dlna-ls-profiles-2.0 qemu-nbd
  14. abrt-action-analyze-backtrace gvfs-cat qmi-network
  15. abrt-action-analyze-c gvfs-copy qmicli
  16. abrt-action-analyze-ccpp-local gvfs-info quota
  17. abrt-action-analyze-core gvfs-less quotasync
  18. abrt-action-analyze-oops gvfs-ls ranlib
  19.  
  20. 〜以下略〜

設定ファイル

更新日: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 を調べてみると以下のように書いてあった。

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

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

Bashの変数

更新日:2019.07.27

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

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

シェル変数の設定

更新日:2019.07.27

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

  1. # OK
  2. 変数名=値
  3.  
  4. # NG
  5. 変数名 =

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

  1. $変数名
  2.  
  3. # または
  4.  
  5. ${変数名}

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

  1. unset 変数名

例えばこんな感じ。

  1. [root@centos7-1 ~]# NAME=BOOKSTORE
  2. [root@centos7-1 ~]# echo ${NAME}
  3. BOOKSTORE
  4. [root@centos7-1 ~]# echo ${NAME}
  5. BOOKSTORE
  6. [root@centos7-1 ~]# unset NAME
  7. [root@centos7-1 ~]# echo ${NAME}

環境変数の設定

更新日:2019.07.27

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

  1. export シェル変数
  2.  
  3. # または
  4.  
  5. # シェル変数の設定と、環境変数の設定を同時に行う
  6. export 変数名=値

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

  1. $変数名
  2.  
  3. # または
  4.  
  5. ${変数名}

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

  1. export -n 変数名

例えばこんな感じ。

  1. [root@centos7-1 ~]# export -p | grep FOGE
  2. [root@centos7-1 ~]# export FOGE=ABC
  3. [root@centos7-1 ~]# export -p | grep FOGE
  4. declare -x FOGE="ABC"
  5. [root@centos7-1 ~]# export -n FOGE
  6. [root@centos7-1 ~]# export -p | grep FOGE
  7. [root@centos7-1 ~]# set | grep FOGE
  8. FOGE=ABC

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

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

更新日:2019.07.27

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

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

参考

更新日:2019.07.27