編集中なのでそのまま使えない内容が多い

シェルについて

シェル(shell)

  • OSと人間の間のプログラム(ユーザインターフェース)
  • シェルを変更することによって操作方法が変わる

主なシェルの種類

  • sh
    ほとんどのUNIXで標準になっている
    bashという名称のものがshとして利用されている(主にLinuxで)
    bash・・・shにさまざまな拡張機能を追加したもの
    シェルスクリプト(のほとんどのもの)はsh(bash)で記述されている
    シェルスクリプト・・・実行するコマンドを順番に書き記したファイル
    テキストの記述はsh(bash)についてのもの
  • csh(C shell)
    スクリプトの記述方法がC言語に似ている
    BSD系OSのrootユーザの標準shellによく用いられる
    最近ではほとんどのlinuxのディストリビューションやBSD系のOSに標準でインストールされている
  • その他
    zsh ashなどなど種類はたくさんあります

bash

Bourne-Again SHell
bourne shellを改良したもの
もともとのshとはちょっとした違いがあるため完全に同じものとして扱うと問題が生じる
本物のshでは使えない機能がある(拡張された部分)

コマンドラインを編集する

コマンドラインで入力ミスをした場合に編集ができる。
カーソルキーの←→とBackSpace(Del)が利用できる
カーソルが行の途中にあっても行全体の内容がシェルに送られる

途中で入力をやめる

CTRL+cでキャンセルされ、新しいプロンプトが表示される

コマンドプロンプト(プロンプト)

シェルがコマンドの入力を待っている状態のこと
また、その状態を表すための表示部分
[pg0000@opserver pg0000]$ ここでカーソルが点滅
↓こちらの例では入力待ちではないのかも知れない
(シェルではない別のプログラムが入力待ちをしているのかもしれない

[pg0000@opserver pg0000]$
ここでカーソルが点滅
この状態でCTRL+cを押すと大体プロンプトに戻る
但し入力待ちをしていたプログラムは終了する

画面モード

画面モードが適切に設定されていないとカーソルキーを利用すると画面が化ける
(カーソルキーが使えない設定がある)
BackSpaseやDelキーも利用できないこともある(大体どちらかは利用可能)

CTRL+b 左 CTRL+f 右(これでも出力が崩れることがある)

入力した履歴を取り出す

今までに利用したコマンドラインの再利用

カーソル上下
↑キーを押すと古い履歴。↓キーを押すと新しい履歴を取り出すことができる
CTRL+p 古い履歴 CTRL+n 新しい履歴

取り出した履歴を編集して利用することも可能

コマンドラインの補完

TABキーを押すことでコマンド名やファイル名を勝手にシェルが入力してくれる機能
補完できる候補が複数ある場合には途中まで補完する
途中まで補完された状態でTABキーを押すことで候補の一覧を表示する
TABキーを2回押して何もおきなければ入力した箇所に誤りがある(補完できるものが何もない)

コマンドに別名をつける(エイリアス)

コマンドの名称が長いものを短いコマンド名で利用できるようにしたり、いつも使うオプションをコマンドにつけた状態で利用できるようにすること。

alias - シェルの組み込みコマンド

エイリアスを設定したり、現在の設定内容を確認するコマンド
alias [オプション] [エイリアス=[実際のコマンド]]
オプション類を一切つけずに起動すると現在の設定の内容を確認することができる

$ alias
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

whichをシェルから呼び出した場合には実際にはalias | /usr/bin/which --tty-only --read-alias --show-dot --show-tildeが実行される

* 設定方法

vimをhogeとして呼び出す設定
$ alias hoge='vim'

エラーが無ければ特に何も出力されずに設定が終わる
=の左右にスペースを入れないこと

組み込みコマンドなのでbashのマニュアルを引くと日本語で説明が読める/^ *alias
課題
mmanと入力したときにman manが実行されるようなエイリアスを設定してください

$ alias mman='man man'

エラー:コマンドが見つからない

  • bash: a: command not found
    このエラーはbashのエラーでaというコマンドが見つからなかった
    ほとんどの場合入力ミス(まれにaliasの間違い)

エイリアスではなくてコマンド自体を呼び出したい場合にはコマンドをシングルコーテーション('')で囲むとエイリアスではなく実際のコマンドが呼び出される

$ alias
alias jman='hoge'
の場合

$ 'jman' man
でaliasに変換されずjman自体が呼び出される
unalias - エイリアスを解除する(シェルの組み込みコマンド)
bashのマニュアルを検索/^ *unalias

unalias [-a] [エイリアス]
オプション類が指定されていなければ何もしない

unalias エイリアス名
指定のエイリアスを削除する
unalias -a
すべてのエイリアスを削除する
シェルの組み込みコマンド
シェルコマンドに組み込まれたコマンド(コマンド名のファイルが存在しない)
コマンドラインで入力されたコマンドはシェルを通して実行される

OSにコマンドラインの内容が渡るまで
シェルの中で各種変換を行う

をホームディレクトリに変換・コマンドがエイリアスならエイリアスの呼び出し先に変換など
コマンドが自分の中の組み込みコマンドかどうか調べる
組み込みコマンドならサブルーチンとして持っているその機能の部分を実行する
コマンドが自分の中に無ければコマンドを外部のファイルとして実行する
呼び出し先が存在しなければcommand not foundのエラーを出す
組み込みコマンドかどうかを調べる
type - コマンドの種類を調べる(組み込みコマンド)
bashのマニュアルを検索/^ *type 

type [オプション] 調べたいコマンド名

$ type type
type is a shell builtin
typeはシェルの組み込みコマンド
$ type passwd
passwd is /usr/bin/passwd
passwdは/usr/bin/passwdファイル
$ type jman
jman is hashed (/usr/bin/jman)
今回のログインで使用済みのコマンド(/usr/bin/jmanファイル)
$ alias
alias man='jman'
$ type man
man is aliasd to 'jman'
manはjmanの別名である
シェルの組み込みコマンドはシェルが変わると使い方が異なったり、使えなかったりすることがある

tcshを使ってみる
cshの拡張版

$ tcsh
bashと異なる操作方法
組み込みコマンドも異なる例:typeコマンドが無く、whereコマンドがある

$ type
type: Command not found.(typeコマンドが見つかりませんでした)
$ where
where: Too few arguments.(whereコマンドの呼び出しに必要なオプションがない)
$ where where
where is a shell built-in
ログインシェルを変更する
ログインシェル・・・ログインしたときに立ち上がるシェルコマンド

chsh - ログインシェルを変更する
chsh [オプション] [ユーザ名]
一般ユーザはユーザ名を指定することができない

chsh -l
ログインシェルとして指定できるコマンドの一覧を出力
/sbin/nologin
ログインできないコマンド(一般ユーザでは通常は指定しない)
chsh -s (chsh -lのリストのうちのどれか)
パスワードを入力し成功すればshell changedと出力され、次回ログイン時から変更が適用される
chsh: "指定したコマンド" does not exist.
chsh -lのリストのうちのどれかを入力ミスした(ログインシェルは変更されない)
chsh: "指定したコマンド" is not listed in /etc/shells.
chsh: use -l option to see list
指定したコマンドがログインシェルとして利用できるリストに含まれていない
課題
ログインシェルを/bin/tcshに変更し、ログインしなおし、以下を間違いなく入力してください

$ cat /etc/passwd|grep 自分のユーザID
入力後エンターキーを押し、出力の末尾が/bin/tcshになっていれば成功している

シェルを終了させる
exit シェルを終了させる(組み込みコマンド)
シェルを終了させる。
シェルが終了すると呼び出し元に戻る
telnet接続時にログインシェルで実行すると接続が切断される

logout ログインシェルを終了させる(組み込みコマンド)
ログインシェルを終了させる
ログインシェル以外で利用するとエラーになる

シェル変数と環境変数
コマンドなどに必要な情報を設定しておく

シェル変数
シェル変数を設定したシェルでのみ有効
シェル自身の設定を行う
環境変数
環境変数を設定したシェルから呼び出したコマンドにも有効
コマンドなどの設定を行う
シェル変数の設定方法
変数名=値
=の前後にスペースを入れないこと

$ TEST=hello
TESTというシェル変数にhelloという値を設定する
シェルの設定に無関係なシェル変数を設定することも可能

set - 組み込みコマンド
オプション類をつけずに実行すると設定されているシェル変数の一覧を表示する

シェル変数の値を呼び出す
$変数名
実行例

$ TEST=passwd
$ jman $TEST
passwdのマニュアルが表示される
$ TEST=man
$ jman $TEST
manのマニュアルが表示される
echo - 文字列を表示する組み込みコマンド
echo [オプション] 文字列
文字列はシェルの各種変換が終了したものが表示されるためシェル変数の確認や記号がどのように展開されるかということの確認にも利用可能

$ echo hoge
hoge
$ TEST=hello
$ echo $TEST
hello
環境変数の設定方法
export - 環境変数を設定する組み込みコマンド
export シェル変数
シェル変数を環境変数にも設定する
export 変数名=値
変数名の変数を環境変数とシェル変数に設定する(bashの拡張機能)
$ TEST=hello
$ export TEST
成功すれば特に何も出力しない

シェル変数と環境変数の比較
シェル変数の場合

$ TEST1=foo
$ echo $TEST1
foo
$ bash(シェルからさらにシェルを呼び出す)
$ echo $TEST1

$
シェル変数は設定したシェル内でのみ有効
シェルから呼び出したコマンドでは設定した値を確認できない

環境変数の場合

$ TEST2=bar
$ export TEST2
$ echo $TEST2
bar
$ bash(シェルからさらにシェルを呼び出す)
$ echo $TEST2
bar
$ echo $TEST1

$
TEST2はexportコマンドにより環境変数になっているため、設定したシェルから呼び出したコマンドでも内容の確認が可能
TEST1はシェル変数のままなので設定したシェル内でのみ有効

printenv - 環境変数を表示する
printenv
オプション類をつけずに起動すると設定されている環境変数の一覧を出力する
printenv 変数名
変数名に設定されている値を表示する
$ printenv TEST2
bar
$ printenv TEST1
$
TEST1は環境変数にしていないのでprintenvでは内容の表示ができない
主なシェル変数や環境変数
シェルの設定を変更するためのシェル変数

PATH
コマンドを探すディレクトリ(フォルダ名)のリスト
リストに含まれているディレクトリ内のコマンドはディレクトリ名を省略して実行することができる

$ PATH=(PATHの値を空にする)
$ chsh -l

  • bash: chsh: No such file or directory(chshなんてコマンドはありませんよ)
    $ /usr/bin/chsh -l
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/bash2
    /bin/ash
    /bin/bsh
    /bin/tcsh
    /bin/csh
    chshは/usr/bin/というディレクトリに格納されているので、ディレクトリ名を指定して実行すると実行できる

$ PATH=/usr/bin:/bin
chsh -l
/bin/sh
/bin/bash
以下略
$
PATHに/usr/binを追加することによってchshをコマンド名だけで呼び出すことができるようになった
複数のディレクトリを設定するには:で区切る

PATHにかかれている順番に検索が行われ、一番初めにコマンドを見つけた場所のコマンドが実行される
組み込みコマンドとファイルのコマンドで同名のコマンドがあった場合には組み込みコマンドが利用される

インストールされているはずのコマンドが実行できないときにはPATHの内容をよく確認する
PATHにインストール先が含まれていなければコマンド名だけでは実行できない

PS1
プロンプト文字列
変数にスペースや特殊記号を含む文字列を設定する場合には''で囲む

$ PS1='[?w]?$ '
[~]$ PS1='> '


LANG(環境変数)
利用する言語を設定する
特に設定なしの場合にはC(英語)
LANG=国コード_言語コード.文字コード
日本の国コードja 日本語の言語コードJP
Windowsのtelnetの場合はEUC(日本語)を利用するので eucJP
$ ls -l /home/sample/dir
total 0

  • rw-rw-r-- 1 pg0000 pg0000 0 Oct 17 11:44 test
    $ echo $LANG
    C
    $ LANG=ja_JP.eucJP(日本語モードにする)
    $ ls -l /home/sample/dir
    $ ls -l /home/sample/dir
    合計 0
  • rw-rw-r-- 1 pg0000 pg0000 0 10月 17 11:44 test
    コマンドがLANG環境変数の内容を調べ、その設定された値によって出力の内容を変更している
    LANG環境変数を変更しても、LANG環境変数をチェックしないコマンドには意味がない
    マニュアルに利用が可能な環境変数が記されていることが多い
    設定したシェル変数・環境変数を削除する
    unset - シェル変数・環境変数を削除する組み込みコマンド
    unset 変数名
    $ unset TEST
    TESTというシェル変数を削除する
    環境変数・シェル変数ともに削除する

$ printenv TEST2
bar
$ unset TEST2
$ printenv TEST2
$(TEST2が削除されたため何も出力されない)
export - 環境変数を設定する組み込みコマンド
export -n 変数名
指定した変数を環境変数として利用するのをやめる
シェル変数としては内容が残る
ログインのたびに設定する
あらかじめ実行することをファイルに書いておく
シェル変数・環境変数・エイリアスはメモリ中に保存されるだけなのでログアウトすると内容が失われてしまいます。
設定の内容をファイルに保存して読み込ませる

プロンプトを$ にし、PATHの内容を/bin:/usr/binにし、LANGをCにしたい場合
どんなコマンドを実行したら↑の内容になるか考える
1の内容をファイルに書く(settei.sh)
PS1='$ '
PATH=/bin:/usr/bin
LANG=C
以下を実行
$ source settei.sh
source - ファイルを読み込む組み込みコマンド
source ファイル名
ファイル名のファイルからコマンドを読み込み実行する

環境変数やシェル変数やエイリアスを設定する際によく利用される

シェル起動時に読み込まれる設定ファイル
.bash_profile
ログイン時だけ読み込まれる(シェルから呼び出された場合には読み込まれない)
各種環境変数やaliasの設定はこのファイルに書くと良い
.bashrc
bash起動時に毎回読み込まれる(シェルから呼び出された場合なども)
絶対に利用したいalias等はこちらに書いておくと良い
.bash_logout
ログアウト時に読み込まれる
コマンド履歴を保存するためのコマンドはここに書くとよい
ログアウト時の後始末に関するコマンドはここに書く
課題
llを実行するとls -lが実行できるようなエイリアスだけがログイン時に設定されるようにしてください

.bash_profileの最後に以下を書き足す

unalias -a
alias ll="ls -l"
次回予告:ファイルとディレクトリについて