Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

LinuxOSについて#2

シェルについて

Shell(シェル)ってなに?

LinuxなどのUNIX系OSのコマンド・インタプリタのことです。「コマンド・インタプリタ」はユーザーがキーボードからコマンドラインに入力したコマンドを解釈してその実行を制御するプログラムのことです。

LinuxOSの中核をなすカーネルに指示を出すために、シェルを用います。

シェルの種類

シェルは大別すると以下の2種類に分かれます。

  1. Bourneシェル(Bシェル)→AT&Tベル研究所が配布したUNIXの標準シェル
  2. Cシェル→BSD UNIXの標準シェル

ちなみにBシェルの機能拡張版がBashです。コマンド名shは,bashへのシンボリック・リンクです。

シェルの操作方法

$ コマンド名 引数

コマンドについて知りたい場合、下記のようにmanコマンドを使用しましょう。

$ man ls

正規表現の利用

LinuxなどのUNIX系OSでは,文字列パターンを指定するための正規表現が利用できます。正規表現は,メタキャラクと呼ばれる特殊文字を用いて,特定の文字列を指定するための表現方法です。

メタキャラクタのまとめです。

*  #任意の文字列
?  #任意の1文字
[] #カッコ内の任意の1文字
[^] #カッコ内の文字列に一致しない任意の文字列
1ls f*  #fで始まるファイル一覧を表示、*は空文字も含むためfという1文字だけの名前のファイルも表示します

実行結果)
file1 file2 file3 file11
2)
ls file?   #?は任意の「1文字」のため、この場合file11というファイルがあっても表示されません

実行結果)
file1 file2 file3
[ab]c #[ab]はaまたはbを指すため、acかbcです)
ls [a-z]*  #[]の中で範囲指定を行い、英小文字26文字のいずれかから始まるファイル一覧を表示

実行結果)
bin file1 file2 file3 file11

例)
ls [^b]*  #b以外で始まるファイル一覧を表示

実行結果)
file1 file2 file3 file11

標準入出力とリダイレクションとパイプ


こちらについては重要ですので、後日詳細に取り上げます。


LinuxOSには入出力装置に関する3つのファイルが存在します。

  1. 標準入力(stdin)
  2. 標準出力(stdout)
  3. 標準エラー出力(stderr)

全て/divディレクトリの中にあり、標準入力と標準入出力をまとめて「標準入出力」と呼びます。

デフォルトでは,標準入力はキーボード,標準出力および標準エラー出力はディスプレイに割り当てられています。

例えば、シェルを使う場合、コマンドの入力には標準入力(キーボード)、コマンドの実行結果の出力には標準出力(ディスプレイ)、エラー・メッセージの出力には標準エラー出力(こちらもディスプレイ)が使われます。

わかりにくいですね。CUIの場合、キーボードからしか入力できず、結果も黒い画面に必ず出てきますが、あれがデフォルトの初期設定で決まっているということみたいですね。

このデフォルトの割り当てを切り替えることを「リダイレクション」と呼びます。

)
$echo helloworld #お馴染みのechoコマンドです。引数に渡した文字列を出力します。

実行結果)
$helloworld

例)
$echo helloworld > helloworld.txt #標準出力の切り替えです!

プロンプトが戻り、コンソールには何も表示されません。代わりに、helloworld.txtの中身を見てみましょう。

$cat helloworld.txt

実行結果:
helloworld

上記の例では、出力が切り替えられ、リダイレクトされたことがわかります。リダイレクションにはメタキャラクタを使用します。

<   #標準入力の切り替え
>   #標準出力の切り替え
>> #標準出力の切り替え(追加出力)
2> #標準エラー出力の切り替え(bash)
&> #標準出力と標準エラー出力の同時切り替え(bash)
>& #標準出力と標準エラー出力の同時切り替え(bashとtcsh)
)
$ echo Hello! > hello.txt
$ echo Hi! > hello.txt

この場合、Hello!が上書きされてしまうので、以下の方が適切です。

$ echo Hello! > hello.txt
$ echo Hi! >> hello.txt

また、「パイプ機能」というものもあります。パイプ機能とは,あるコマンドの標準出力と別のコマンドの標準入力を連結することです。パイプのメタキャラクタは「|」です。

)
$ ls 
実行結果:
file1 file2 file3


$ ls | sort -r   #lsの出力をsortで利用し、-rオプションで辞書の逆順に表示します
実行結果:
file3
file2
file1

エイリアス・ヒストリー・ディレクトリスタック

エイリアスはコマンドに名前をつけること、ヒストリーはコマンドの履歴ですね。

$ alias cls=clear #clearコマンドにclsという名称をつけています。
$ unalias cls #上記のエイリアスを解除

$ history  #実行すると、コマンドの履歴が入力順に表示されます。
$ !4 #historyコマンドの番号に沿って(この場合4番目のコマンド)、コマンドを呼び出します。

ちなみに直前に実行したコマンドは以下のメタキャラクタで表示できます。
$ !! 

ディレクトリスタックとは元にいたディレクトリをシェルに記憶してもらう機能です。階層構造であるが故にできる技ですね。

)
$ dirs  #現在のディレクトリスタックの内容を表示
~ #ホーム・ディレクトリがカレントディレクトリ
$ pushed /tmp #~がスタックに入り、/tmpがカレントディレクトリに
/tmp ~
$ pwd
/tmp
$ popd #一番上のスタックをカレント・ディレクトリにする
~

cdでカレントディレクトリを頻繁に変更することがあると思うので、ブックマークのように使えますよね。

コマンドを実行する上でのメタキャラク

)
$ pwd ; ls #pwdコマンド実行後、lsコマンド実行
実行結果)
/home/b_leiu
file1 file2 file3

例)
$ pwd & ls #同時並行で実行

&を使用する場合、pwdコマンドの実行開始直後にlsコマンドの実行も開始されます。最初のコマンドpwdバックグラウンド・プロセス、2番目のコマンドlsをフォアグラウンド・プロセスといいます。 フォアグラウンド・プロセスの実行を中止する場合は、Ctrl + cを実行するだけでOKです。代わりに、バックグラウンド・プロセスを強制終了するには、一手間かかります。

$ ps #実行中のプロセス一覧を表示、PIDの列にプロセス番号が表示される
$ kill 777 #プロセス番号777のバックグラウンド・プロセスを強制終了

シェル変数と環境変数

シェル変数とは、現在実行中のシェルだけで有効な変数。環境変数は、シェルから実行したコマンドにも引き継がれる変数。
bashではシェル変数と環境変数をほぼ一体化して扱っています。

$var=example  #変数varにexampleを設定、空白に注意です。
$export var #シェル変数を環境変数に
$echo ${var} #先頭に$をつけることで格納された値を参照します。
$printenv #環境変数一覧を表示する

$unset var #シェル変数自体の削除です。
$set #シェル変数の一覧表示です。

追記: シェル変数と環境変数の違いがわかりにくいですね。両方、exitしたら参照できなくなります(PATHに設定しているものなどは別)。

$nyao=123  #シェル変数に設定
$env | grep nyao   #環境変数を表示するenvコマンドと文字列を検索するgrepコマンドをパイプしています

何も表示されないです・・・

$export nyao #環境変数に設定
$env | grep nyao
nyao=123      #環境変数の中から見つかりましたね!

シェルの設定ファイルについて

シェルをカスタマイズしても,シェルの実行を終了するとすべての設定内容は捨てられてしまいます。その都度カスタマイズするのは面倒ですよね。

設定ファイル」と呼ばれるテキスト形式のファイルにカスタマイズする内容を記述しておくと、次回起動時にこの設定ファイルを読み込み,カスタマイズを自動実行して立ち上がります。

シェルの設定ファイルは、先頭の文字が「.」であり,隠しファイルになっています。ホームディレクトリに格納されており、lsコマンドに-aオプションを渡すと確認できます。

  • bashがログイン・シェルの場合は、「.bash_profile」(存在しない場合、「.bash_login」あるいは「.profile」)
  • bashがログイン・シェルでない場合は、「.bashrc」を読み込む

プロンプトの文字列

bashのプロンプト文字列は、シェル変数PS1に設定されています。PS2もプロンプト文字列ですが、「\」を入力して改行したりする際に出力されます。

以下はFedora Core 3およびVine Linux 3.1のプロンプト文字列の例です。

PS1 = ' [\u@\h  \w]\$  '  #\uはユーザー名、\hはホスト名、\wはカレント・ディレクトリを指します。
PS2 = '> '

ユーザーはシェルのプロンプトを自由に変更することができます。変更を次回以降も反映したい場合は、設定ファイル「.bashrc」に保存しましょう。

システム管理に役立つコマンド

$uname #システムの情報を表示
Linux
$uname -a #-aオプションを指定すると、詳細な情報を表示
$hostname #ホスト名を表示
$uptime #システムがどの位、連続して稼働しているかを表示
$date #システムの日付を表示
$users #ユーザー名を表示
$who #ユーザー名以外に利用している端末とログインした時間を表示
$w #uptimeコマンドの実行結果と、2行目以降はユーザー情報を表示
$whoami #ユーザーIDに対応するユーザー名を表示
$last #最近ログインしたユーザーのリストを表示

最後に

明日はシェル・スクリプトを取り上げます。