Steven Bourne さんが作ったシェル。
実行ファイル名は sh だが、作者に敬意を込めて(?)今でも Bourne Shell (ボーンシェル)、B-sh (ビーシェル) と呼ばれる。 UNIXの歴史とともに登場し、今なお使われていると言う驚異のシェル。 機能的には原始的だがすべてのUNIXマシン上に必ず存在しており、実装によってスクリプトの解釈が異なるということが(あまり)なく、1行の中で for ループが組めたりするのでシェルスクリプトはsh用に書くのが普通だ。 (cshでは1行の中でループすることはできず、複数行のシェルスクリプトにする必要があるらしい。) しかし、ファイル名の補完機能が無いなどユーザーインターフェースに難があるので、普段のシェルとしては使いにくい。
ちなみに、FreeBSDの/bin/shは、shというファイル名でsh系なのだが機能拡張されたashというもの。
標準エラー出力を標準出力に混ぜて出力する時には
cat hoge 2>&1などとする。 数字の2が標準エラー出力をあらわすファイル記述子で、数字の1が標準出力を意味するファイル記述子である。(ファイル記述子は、C言語でopen("filename", 0)などとした場合に帰ってくる整数値のことだ。)
標準エラー出力と標準出力を混ぜた状態でファイルに保存するには
余談だが、2番目の例の場合、>filename と 2>&1 の順番を変えてはならない。 人間の直観に反する指定方法だが、
シェルの設定は ~/.profile というファイルに記述する。 cshでは、~/.login にインタラクティブシェルの場合の設定(例えば、sttyコマンドの実行など)を記述し、~/.cshrcは csh が起動するときは毎回実行される設定(たとえば、各種環境変数の設定など)を記述する。 しかし、sh は全部 ~/.profile に書くことになる。 実際には、環境変数 TERM が /dev/ttyv0 か、 /dev/console だったらインタラクティブシェルとして実行中だと仮定してstty などの設定を行ない、それ以外なら telnet や rlogin, kterm からのログインとか、子シェル実行だと仮定して環境変数などの指定だけを行なうように .profile を調整するようだ。
変数展開(ashによる拡張機能。本来のshにはこの機能は無い。)
とある変数に i='abc.txt' のような内容が入っている場合、${i%txt}は abc. に展開される。 拡張子を変更したい場合などに便利だ。
シェルスクリプト中で set -e などと記述しておくと、if while などの条件判断文を除いた地の文(?)中で実行したコマンドの終了ステータスがエラーだった場合、即座にシェルスクリプトの実行を中断するようになる。 シェルスクリプトのデバッグ中には便利かも。
sh自体は計算機能を持たない。そんなわけで、外部コマンドexprが活躍する。 aという変数に1を足す場合は以下の通り。
a=`expr $a + 1`
ただし、あらかじめa=0などと、値を入れておく必要がある。 そうしないと、"expr + 1" を実行することになるので、exprが文法エラーを報告する。
FreeBSDページの目次に戻るsh を拡張したシェルで、シェルスクリプトの書き方は sh の上位互換になっている。 私が普段使っているシェルだ。 キーバインドがデフォルトで Emacs 風味なので、Emacs使いにとっては快適なシェルなのだ。
シェルの設定は ~/.bash_profile にインタラクティブ実行用の設定を、 ~/.bashrc に bash を実行する時は毎回実行される設定を記述する。
プロンプト指定の内部で使われている特殊文字の内容は下記の通り。
一応、私が使っている ~/.bashrc と ~/.bash_profile を下記に示す。
# カレントディレクトリにあるファイル名をechoする for i in * do echo $i done
bashはsh系なので、 ; (セミコロン)で区切ってループ命令を一行で書くことができる。
# カレントディレクトリにあるファイル名をechoする (1行版) for i in * ; do echo $i ; done
FreeBSDでは、rootが使用するデフォルトのシェルとして設定されている。 バークレイとIIASAの人たちによって開発されたシェル。 人間が扱いやすいように、shと比べると色々と改良されている。 cshもほとんど全てのUNIXマシンに標準装備されていると考えて良く、操作方法を一応押えておきたいシェルだ。
# カレントディレクトリにあるファイルのファイル名をechoする。 foreach i (*) echo $i endshと異なり、 foreach i (*) ; echo $i ; end などと一行にまとめて書くことはできない。
set var=hoge echo hoge{$var}hoge
#!/bin/csh # # 足し算サンプル(笑) for csh # set var = 1 @ var = $var + 2 @ var ++ echo $var計算結果は 1 + 2 + 1 で 4 になるはずだ。
if ( $1 == "abc") then echo "abc" else echo "other" endif
cshライクだが、高機能なシェル。
私はほとんど使わないが、広く一般に使われているシェルである。
プロンプト指定は、下記のように行う。
set prompt='%n@%m %~ %% 'また、コマンドライン編集を emacs ライクにするには、
bindkey -e
とする。
FreeBSDページの目次に戻る