FreeBSD shell 紹介

Last Update (2002/03/12 06:53:52)

ミラーサイト [www.ceres.dti.ne.jp] [yk.rim.or.jp]

[ホームページ] [日記] [読んでいる日記] [秋葉原価格] [FreeBSD] [FreeBSD LINK] [検索] [高速検索]

shell紹介


sh

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)などとした場合に帰ってくる整数値のことだ。)

標準エラー出力と標準出力を混ぜた状態でファイルに保存するには

  1. cat hoge 2>&1 | tee filename
  2. cat hoge >filename 2>&1
とする。

余談だが、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による足し算

sh自体は計算機能を持たない。そんなわけで、外部コマンドexprが活躍する。 aという変数に1を足す場合は以下の通り。

a=`expr $a + 1`
    

ただし、あらかじめa=0などと、値を入れておく必要がある。 そうしないと、"expr + 1" を実行することになるので、exprが文法エラーを報告する。

FreeBSDページの目次に戻る

bash - Bourne Again Shell

sh を拡張したシェルで、シェルスクリプトの書き方は sh の上位互換になっている。 私が普段使っているシェルだ。 キーバインドがデフォルトで Emacs 風味なので、Emacs使いにとっては快適なシェルなのだ。

シェルの設定は ~/.bash_profile にインタラクティブ実行用の設定を、 ~/.bashrc に bash を実行する時は毎回実行される設定を記述する。

プロンプトの指定方法(一般ユーザモード)
PS1='\u@\h \w $ '
プロンプトの指定方法(スーパーユーザモード)
PS1='\u@\h \w # '
sh系のシェル(Bシェル系のシェルと呼ばれることもある)の場合、一般ユーザのプロンプトは $ で、スーパーユーザのプロンプトは # になるのがデフォルトだ。 自分でプロンプトを設定する場合でも、この法則を踏襲しておく方が混乱しなくて良いと思う。

プロンプト指定の内部で使われている特殊文字の内容は下記の通り。

\u
ユーザ名を表している。
\h
ホスト名を表している。
\w
現在のワーキングディレクトリを表している。

一応、私が使っている ~/.bashrc と ~/.bash_profile を下記に示す。

forの構文
bashの場合は、ashと同じだ。
# カレントディレクトリにあるファイル名をechoする
for i in *
do
    echo $i
done
	

bashはsh系なので、 ; (セミコロン)で区切ってループ命令を一行で書くことができる。

# カレントディレクトリにあるファイル名をechoする (1行版)
for i in * ; do echo $i ; done
	
便利なbashの内部コマンド
declare
シェルで定義されている変数や関数などの名前と内容を全部表示する。
declare -F とすると、定義されている関数名だけを表示してくれる。 declare -f とすると、定義されている関数名と、その内容を表示する。 色々と便利なので、マニュアルで「declare」を検索して細かいオプションなどをチェックしておくと良い。
FreeBSDページの目次に戻る

csh

FreeBSDでは、rootが使用するデフォルトのシェルとして設定されている。 バークレイとIIASAの人たちによって開発されたシェル。 人間が扱いやすいように、shと比べると色々と改良されている。 cshもほとんど全てのUNIXマシンに標準装備されていると考えて良く、操作方法を一応押えておきたいシェルだ。

シェル変数の指定方法
set history=1000
(= が必要な点に注意)
aliasの指定方法
alias ls ls -F
(= が必要無い点に注意)
環境変数の指定方法
setenv BLOCKSIZE K
(= が必要無い点に注意)
プロンプトの指定方法(ユーザモード)
set prompt="[\!] `whoami`@`hostname -s` `pwd` %"
プロンプトの指定方法(スーパーユーザ(root)モード)
set prompt="[\!] `whoami`@`hostname -s` `pwd` #"
cshの場合、一般ユーザのプロンプトは % で、スーパーユーザのプロンプトは # になるのがデフォルトだ。 自分でプロンプトを設定する場合でも、この法則を踏襲しておく方が混乱しなくて良いと思う。
プロンプト指定の内部で使っている ! には、ヒストリ番号を表示するという意味がある。(そのまま!と書くとまずいので、\!と書いてクゥオートしている。)
標準エラー出力をファイルに残すには、 cat hoge >& filename とする。
ファイル名の補完を利用する場合は、set filec という指定を .cshrc に記述しておくと良い。 ESCキーで補完できるようになる。
foreach の構文
cshの場合は、以下のように使用する。
# カレントディレクトリにあるファイルのファイル名をechoする。
foreach i (*)
  echo $i
end
	
shと異なり、 foreach i (*) ; echo $i ; end などと一行にまとめて書くことはできない。
変数名の囲い方
変数名の前後に文字をつなげたい場合は、以下のように { } を利用する。
set var=hoge
echo hoge{$var}hoge
	
ヒストリの使い方
cshは bashなどのように、Ctrl + p で前に実行したコマンドを呼び出すことはできないが、!を使用して前に実行したコマンドを再利用することができる。
以下のような指定方法は慣れるまでは大変だが、慣れてみると画面を見なくてもサクサクとコマンドを再実行できたりするので意外に便利だった。
!!
直前に実行したコマンドラインの再実行。
^a^b
直前に実行したコマンドラインに対して、aをbで置換してから実行。
!ec
ヒストリに残っているecからはじまるコマンドラインのうち、最後に実行したコマンドラインを実行。
!35:s/a/b
ヒストリ行35番目のコマンドラインに対して、aをbで置換してから実行。
echo !35:1
ヒストリ行35番目の1番目の引数をechoする。
変数展開・ヒストリ展開
変数の内部やヒストリの内部にファイル名があった場合、ファイル名のうちパス名部分だけを取り出したり、拡張子だけを取り出したりできる。
${VAR:t}
basenameに同じ。 パス名部分を除いたファイル名を取り出すときに使う。
${VAR:h}
dirnameに同じ。 ファイル名部分を取り除いて、パス名部分だけにしたい場合に使う。
${VAR:r}
拡張子部分を削除。
${VAR:e}
拡張子部分をのこして、ほかの部分を削除。
足し算のしかた
cshで足し算を行う場合は、行の先頭に @ (アットマーク)をつけて、その後ろにスペースを一つ以上入れてから式を書く。 以下にサンプルを示す。
#!/bin/csh
#
#    足し算サンプル(笑) for csh
#
set var = 1
@ var = $var + 2
@ var ++
echo $var
計算結果は 1 + 2 + 1 で 4 になるはずだ。
if文のサンプル
微妙にC風。
if ( $1 == "abc") then
	echo "abc"
else
	echo "other"
endif
FreeBSDページの目次に戻る

tcsh

cshライクだが、高機能なシェル。
私はほとんど使わないが、広く一般に使われているシェルである。
プロンプト指定は、下記のように行う。

set prompt='%n@%m %~ %% '
      
また、コマンドライン編集を emacs ライクにするには、
bindkey -e
    

とする。

FreeBSDページの目次に戻る
Copyright(c) 1996,97,98,99,2000,01,02,03,04 George(小濱 純). All rights reserved.
私の作成したページへのリンクはご自由にどうぞ。
このページに間違いや要望などがありましたら george@yk.rim.or.jp まで御連絡ください。

[ホームページ] [日記] [読んでいる日記] [秋葉原価格] [FreeBSD] [FreeBSD LINK] [検索] [高速検索]

home: <george@yk.rim.or.jp> or <george@ceres.dti.ne.jp>
(I am using SPAM filter, so please phone me when you wrote mail to me.)