セミナー B, F, G

シェルについての教材補足

2022年6月21日のシェルスクリプトについての授業の教材で、 csh と bash についての記述がまざってしまっていたので、 それを整理しながら補足する。

注意: 確認が不じゅうぶんなところがあります。今後、確認しながら改訂するつもりです。

シェルについて

Linux は、いわば「Unix系」の (Unix の仕様にならってつくられた) OS (オペレーティングシステム) である。 Unix系のOSは、カーネル (kernel、核) と シェル (shell、殻) からなっている。 ユーザーのコマンドをうけつけるところはシェルであり、 ユーザーはカーネルと直接かかわることはほとんどない。 同じ OS に複数のシェルがあり、ユーザーがこのみに応じて選択できることがある。

Unix で最初につくられたシェルは「sh」というプログラム名で、 他のものと区別するときは、ボーン (Bourne) シェルとよばれることがある。 つぎに「csh」(C shell) というものがつくられた。 その文法が (ちょっとだけ) C言語ににているからそうよばれたらしい。 その後、sh の上位互換の (sh でできることは同じ形式でできて、さらに追加の機能がある) 「bash」や、csh の上位互換の「tcsh」がつくられた。 いまどきの Linux では「sh」で bash が、「csh」で tcsh がうごくのがふつうになっている。

ここでは「bash」と「csh」で代表させることにする。 bash と csh の機能はだいたいおなじだが、文法がすこしちがう。 (ドイツ語と英語、あるいはフランス語と英語とのちがいと、ちょっとにたところがある。)

シェルスクリプト

シェルは、対話型利用のほかに、 コマンドを列挙したテキストファイル (「シェルスクリプト」という) をつくっておき、 シェルにあたえて、まとめて実行させる、というつかいかたがある。

シェルスクリプトを実行させるには、つぎのような方法がある。

シェル変数と環境変数

シェルでは、コマンドに出てくる文字列をくみたてるプログラミングができる。 そのための「シェル変数」がある。 また、「環境変数」というものがある。 これは、シェルスクリプトどうしで共通につかわれる変数である。 (環境変数は、各計算機上のユーザーに共通なローカル標準設定をあたえるためにもつかわれる。 自分で環境変数を設定するときには、ローカル標準設定にあるものをへたにかえてしまわないように 注意する必要がある。)

コマンドとして実行される文ではなく、シェルのなかの演算をする文について、 bash と csh の文法には、つぎのようなおおまかなちがいがある。

このページの例文にかぎって、空白 (space) を「␣」であらわす。 【「␣」という記号は、漢字などと同じ「全角」の文字幅で表示されてしまうが、 例文でその記号があらわすのは、 日本語文字セットにある空白 (いわゆる「全角の空白」) ではなく、 いわゆる「英数」文字セットにある空白 (いわゆる「半角の空白」) である。】

シェル変数を設定し、値をあたえる

csh
set␣シェル変数名␣= ␣値 (← 空白に注意。 「=」記号も必要。[2022-06-28 修正])
bash
シェル変数名=値 (← 空白をいれない)

シェル変数 (または環境変数) の値を参照する

(bash, csh とも) シェル変数名のまえに「$」をつける。 とくに、端末画面に表示させたいならば

環境変数を設定し、値をあたえる

csh
setenv␣環境変数名␣値
bash
シェル変数名=値 (← まずシェル変数をつくる)
export␣シェル変数名 (← これでシェル変数が環境変数にかわる)

環境変数の一覧

(bash, csh とも) 「env」 で表示される。

alias (エイリアス、別名)

コマンドに別名 (略称のようなもの) をつけることができる。

csh
「alias␣別名␣本名」 (← 空白に注意)
bash
「alias␣別名=本名」 (← 「=」があり、その直前・直後には空白がない)

この授業では、つぎのような目的で alias をつかう。 授業では、Python の version 3 をつかいたいのだが、 授業用につかう Linux サーバーでは、 「python」とすると Python の version 2 がうごいてしまう。 Version 3 は anaconda というパッケージの一部としてインストールされたので、 /usr/bin/anaconda3/bin/python となっている。 これを「python3」で実行できるようにする。

csh
alias␣python3␣"/usr/bin/anaconda3/bin/python" (← 「aliasa」と書いてしまったが「alias」と訂正した。)
bash
alias␣python3=/usr/bin/anaconda3/bin/python

ログインしたとき起動される bash で実行できるようにするために、 各自のホームディレクトリにある「.bashrc」 (最初の字はピリオド) というファイルに、 この alias 文 (bash用の形) をいれた。

csh によるシェルスクリプトでは、この alias 文 (csh用の形) を、 シェルスクリプトの頭 (「#!/bin/csh」のつぎ ) に入れてほしい。


余談: 増田の事情

1980年代、対話型には csh、シェルスクリプトには sh がよいといわれていた。 しかしわたしは、ログインすると csh がうごいている計算機で Unix をつかいはじめ、 複数のシェルをおぼえる時間がおしかったので、シェルスクリプトも csh でかいてしまった。 ところが、2012年ごろ、あらたにインストールした Linux は、 ログインすると bash がうごいていた。 わたしはそのままつかうことにし、シェルスクリプトも bash 用にかきなおすことにした。

このような変化は、増田にかぎらず、ありがちなことのようだ。 地球科学で地図上にデータを表示するのによくつかわれる GMT (Generic Mapping Tools) というソフトウェアの例文のシェルスクリプトは、 1990年代には csh のスクリプトだったが、 いまは bash のスクリプトがおもになっている。


2022-06-22, 2022-06-25, 2022-06-28
増田 耕一 (MASUDA Kooiti)
増田の個人サイトでの [立正大学の授業用の教材ページ] [教材目録ページ] [日本語入り口ページ] [ホームページ]