bashシェルとは

 ユーザが入力するコマンドは直接OSに送られるのではなく、シェルに対して送られる。シェルとはユーザがログインするときに起動されるプログラムの事で、ユーザとOSの対話を仲介するインターフェイスの役割を果たしている。
 シェルにはいくつかの種類が有るが、一般にLinuxではBシェル系の「bach」と呼ばれるsh(Bourneシェルと呼ばれるUNIX初期のシェル)の高機能版がよく使われる。


主なショートカットキー
[Ctrl]+[A] [Home]
[Ctrl]+[E] [End]
[Ctrl]+[D] [Delete]
[Ctrl]+[H] [BackSpace]
[Ctrl]+[L] 画面のクリア
[Ctrl]+[C] 実行中の処理を停止
[Ctrl]+[Z] 実行中の処理を一時停止


主な履歴機能
[↑]or[Ctrl]+[P] 履歴を遡って表示
[↓]or[Ctrl]+[N] 履歴を実行順に表示
!! 直前のコマンドを再実行
!n 履歴番号nの再実行
!str 文字列strで始まるコマンドの内、最も新しいものを再実行
!?str 文字列strを含むコマンドの内、最も新しいものを再実行
history 現在記憶されている履歴を番号付きで全表示
※ コマンド履歴はbashシェル終了時にユーザーのホームディレクトリ内「.bash_history」ファイルに保存。(デフォルトでは1000回分まで記憶されている)

$ history ←現在の履歴を表示(実行する)
  .
  .(省略)
  .
 604 cd /var/log/
 605 ls -al
 606 cat maillog
 607 cat messages
 608 ls -al
 609 cat chkrootkit.log
 610 cat yum.log
 611 exit
 612 history
$ ←ここで[↑]もしくは[Ctrl]+[P]を押すと
 ↓こうなる

$ history
 ↓もう一度押すと
$ exit
 ↓さらにもう一度押すと
$ cat yum.log
 ↓ここで[↓]もしくは[Ctrl]+[N]を押すと
$ exit
 ↓もう一度押すと
$ history ←これらは表示されるだけで実行されない


上記の履歴状態で以下のコマンドを実行すると


$ !! ←直前のコマンドの再実行
 history ←実行されたコマンドが表示される
 1 kon
  .
  .(省略)
  .
 604 cd /var/log/
 605 ls -al
 606 cat maillog
 607 cat messages
 608 ls -al
 609 cat chkrootkit.log
 610 cat yum.log
 611 exit
 612 history
 613 history ←再実行分も履歴に入る


$ !608 ←履歴番号608番の再実行
 ls -al
 合計 192
 drwxr-x---  4 root root 4096 4月 15 15:06 .
 drwxr-xr-x 23 root root 4096 5月 16 19:23 ..
 -rw-------  1 root root 12920 4月 16 06:05 .bash_history
 -rw-r--r--  1 root root  24 9月 23 2004 .bash_logout
 -rw-r--r--  1 root root  191 9月 23 2004 .bash_profile
 -rw-r--r--  1 root root  176 9月 23 2004 .bashrc
  .
  .(省略)
  .


$ !cat ←履歴の「cat」で始まる最新のものを再実行
 cat yum.log
  .
  .(省略)
  .


$ !?sto ←履歴の「sto」を含む最新のものを再実行
 history
 1 kon
  .
  .(省略)
  .
 604 cd /var/log/
 605 ls -al
 606 cat maillog
 607 cat messages
 608 ls -al
 609 cat chkrootkit.log
 610 cat yum.log
 611 exit
 612 history
 613 history ←「!!」分(直前のコマンドと同じ)
 614 ls -al ←「!608」分(608番のコマンドと同じ)
 615 cat yum.log ←「!cat」分(catから始まる最新のコマンド=610番)
 616 history ←「!?sto」分(stoを含む最新のコマンド=613番)


補完機能

 コマンド名やディレクトリ名を途中まで入力して[Tab]を押すと、残り部分が補完される。
 候補が複数有る場合は、もう一度[Tab]を押すと一覧表示される。

$ pass ←この状態でTabキーを押すと
 ↓こうなる

$ passwd

$ ca ←この状態でTabキーを押すと
 ↓候補が複数有るので変わらない

$ ca ←もう一度Tabキーを押すと
 cal         canlisp       captoinfo
 caller       cannacheck     case
 callgrind      cannaping      cat
 callgrind_annotate cannastat      catchsegv
 callgrind_control  capifax       catdic
 cancel       capifaxrcvd
 cancel.cups     capiinfo ←候補が一覧で表示される


複数コマンドの実行

複数コマンドの指定
cmd1;cmd2 cmd1、cmd2を順に実行
cmd1&&cmd2 cmd1の実行が成功すればcmd2を実行
cmd1||cmd2 cmd1の実行が失敗すればcmd2を実行
(cmd1;cmd2) 共通の指定を行うなど、ひとまとまりの単位で実行

~]$ cat messages ←別のディレクトリに有るので表示できない
 cat: messages: そのようなファイルやディレクトリはありません
~]$ cd /var/log/;cat messages ←正しいディレクトリに移ってから実行
 .
 .(省略) ←表示される
 .
log]$ ←最初のコマンドで別のディレクトリに移動したのでそのまま

$ ls -al ←現在のディレクトリ内の確認
 合計 76
 drwx------ 4 user user 4096 6月 23 03:25 .
 drwxr-xr-x 6 root root 4096 1月 23 20:05 ..
 -rw------- 1 user user 2032 6月 21 16:09 .bash_history
 -rw-r--r-- 1 user user 24 1月 5 2004 .bash_logout
 -rw-r--r-- 1 user user 191 1月 5 2004 .bash_profile
 -rw-r--r-- 1 user user 124 1月 5 2004 .bashrc
 -rw-r--r-- 1 user user 5542 1月 5 2004 .canna
 drwx------ 2 user user 4096 4月 13 03:55 .ssh
 drwxr-xr-x 2 root root 4096 1月 23 21:02 defconf
 -rw-r--r-- 1 root root 144 4月 15 15:04 hpbackup.sh
$ mkdir test&&ls -al ←サブディレクトリを作成後、表示
 合計 80
 drwx------ 5 user user 4096 6月 23 03:17 .
 drwxr-xr-x 6 root root 4096 1月 23 20:05 ..
 -rw------- 1 user user 2032 6月 21 16:09 .bash_history
 -rw-r--r-- 1 user user 24 1月 5 2004 .bash_logout
 -rw-r--r-- 1 user user 191 1月 5 2004 .bash_profile
 -rw-r--r-- 1 user user 124 1月 5 2004 .bashrc
 -rw-r--r-- 1 user user 5542 1月 5 2004 .canna
 drwx------ 2 user user 4096 4月 13 03:55 .ssh
 drwxr-xr-x 2 root root 4096 1月 23 21:02 defconf
 -rw-r--r-- 1 root root 144 4月 15 15:04 hpbackup.sh
 drwxrwxr-x 2 user user 4096 6月 23 03:17 test ←「test」ディレクトリ作成に成功したのでカレントディレクトリの詳細を表示している

$ ls -al test ←サブディレクトリ「test」の中の確認
 合計 16
 drwxrwxr-x 2 user user 4096 6月 23 03:20 .
 drwx------ 5 user user 4096 6月 23 03:17 ..
 -rw-rw-r-- 1 use r user 9 6月 23 03:20 test.txt ←ファイルがある
$ rmdir test ←testディレクトリの削除
 rmdir: `test': ディレクトリは空ではありません ←消せない
$ rmdir test||rm -Rf test ←1つ目のコマンドで削除出来なければ、2つ目のコマンドで削除
 rmdir: `test': ディレクトリは空ではありません ←1つ目のコマンドのエラーメッセージ(失敗した)
$ ls -al
 合計 76
 drwx------ 4 user user 4096 6月 23 03:25 .
 drwxr-xr-x 6 root root 4096 1月 23 20:05 ..
 -rw------- 1 user user 2032 6月 21 16:09 .bash_history
 -rw-r--r-- 1 user user 24 1月 5 2004 .bash_logout
 -rw-r--r-- 1 user user 191 1月 5 2004 .bash_profile
 -rw-r--r-- 1 user user 124 1月 5 2004 .bashrc
 -rw-r--r-- 1 user user 5542 1月 5 2004 .canna
 drwx------ 2 user user 4096 4月 13 03:55 .ssh
 drwxr-xr-x 2 root root 4096 1月 23 21:02 defconf
 -rw-r--r-- 1 root root 144 4月 15 15:04 hpbackup.sh
  ←2つ目のコマンドでtestディレクトリは削除されている


シェル変数と環境変数

 シェルやLinuxのアプリケーションでは、固有の変数を用いることで、その動作を規定したり、実行に必要な情報を設定する事が出来る。
 変数には「シェル変数」と「環境変数」の2種類があり、シェル変数は変数を設定したシェルに対してのみ有効で、環境変数はそのシェルから実行したプロセスにも設定が引き継がれる。このため、シェル変数はシェルの動作や情報を設定するために使用されることが多く、環境変数はアプリケーションの実行の際に必要な設定によく使われる。

変数の設定方法
$ 「変数名」=「値」 変数の定義
$ unset 「変数名」 アンセット 変数の削除
$ export 「変数名」 エクスポート 変数のエクスポート(環境変数化)
$ set セット 環境変数、シェル変数の一覧表示
$ env エンブ 環境変数の表示
$ echo $「変数名」 エコー 環境変数・シェル変数の内容表示

$ set ←変数の一覧表示
  .
  .(省略) ←これから作る変数と同じ名前が無いことを確認
  .
$ HENSU=test ←シェル変数「HENSU」を内容「test」にて作成
$ echo $HENSU ←内容の確認
 test ←設定通りのデータが入っている
$ set
  .
  .(省略)
  .
 HENSU=test ←新しく追加されている
  .
  .(省略)
  .
$ env ←環境変数の一覧表示
  .
  .(省略) ←「HENSU」は入ってない
  .
$ export HENSU ←シェル変数「HENSU」を環境変数に変更
$ env
  .
  .(省略)
  .
 HENSU=test ←新しく追加されている
  .
  .(省略)
  .
$ export HENSU2=date ←新しく環境変数「HENSU2」を内容「date」にて作成
$ env
  .
  .(省略)
  .
 HENSU2=date ←新しく追加されている
 HENSU=test
  .
  .(省略)
  .
$ unset HENSU ←変数の削除
$ env
  .
  .(省略)
  .
 HENSU2=date ←環境変数「HENSU」は削除されている
  .
  .(省略)
  .
$ set
  .
  .(省略)
  .
 HENSU2=date ←シェル変数にも残っていない
  .
  .(省略)
  .


主な環境変数
HISTFILE コマンド履歴の保存ファイル名
HISTSIZE コマンド履歴の最大値
HOME ユーザのホームディレクトリ名
HOSTNAME ホスト名
LANG 使用言語
PATH コマンドサーチパス
PS1 プロンプトとして表示する文字列
SHELL 現在のシェル名
TERM 現在のターミナル名
USER 現在のユーザ名


引用符

 コマンドのパラメータを記述するとき、引用符をつかって任意の文字列を指定する事ができる引用符の種類は以下の3つがある。

引用符
'' シングルクォーテーション 文字列中に変数があっても展開されない
"" ダブルクォーテーション 文字列の変数名の前に「$」をつけている場合、その内容に置き換えられる
`` バッククォーテーション 「"」同様置き換えられるが、その内容がコマンドであった場合、コマンドの実行結果と置き換えられる
\ エンマーク(バックスラッシュ) エスケープ文字。直後の一文字が通常の文字とみなされる
 ※エスケープ文字は機種によってはバックスラッシュになる


$ echo $HENSU2 ←変数「HENSU2」の内容確認
 date
$ echo '$HENSU2'
 $HENSU2 ←指定された文字列がそのまま表示されている
$ echo "$HENSU2"
 date ←指定された文字列内の変数が展開(内容に置き換え)されている
$ echo `$HENSU2`
 2005年 6月 26日 日曜日 13:42:54 JST ←指定された文字列内の変数の内容がコマンドなので、その実行結果が表示されている
$ echo "\$HENSU2"
 $HENSU2 ←「$」が文字として扱われているため、直後の変数は文字列とみなされている