更新日: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が起動すると、以下のファイルを順番に読み込む。
/etc/profile
... システム環境特有の設定が記述されている。~/.bash_profile
... 個人用の初期化ファイル。~/.bash_login
... ログイン時に読み込まれるファイル?~/.profile
... 一番最後に読み込まれる個人用初期化ファイル?非インタラクティブログインシェルとしてBashが起動すると、以下のファイルを読み込む。
~/.bashrc
... 対話シェルごとに実行される、個人用のファイル。
しかし、一般的には ~/.bash_profile
には ~/.bashrc
が存在するならば読み込むと書かれているので、インタラクティブログインシェルとして起動したとしても ~/.bashrc
が読み込まれる。試しに ~/.bash_profile
を調べてみると以下のように書いてあった。
- if [ -f ~/.bashrc ]; then
- . ~/.bashrc
- fi
初期化ファイルがたくさんあるが、基本的には ~/.bashrc
に個人用の設定をするでいいらしい。
更新日: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起動時に変数を設定するようにする。
更新日:2019.07.27
変数の中にはBashから使用されるものがある。
変数名 | 内容 |
---|---|
PS1 | プロンプトの設定 |
PATH | 外部コマンドの検索パス |
LANG | ロケール |
HOME | ホームディレクトリ |
更新日:2019.07.27