echoコマンド

引数の文字列を標準出力に出力する。引数の間を1つの空白文字(' ')で区切り、最後に改行('\n')を付加したものを標準出力に出力する。

オプションは以下の通り。

  • -n: 改行を付加しない。

シェルによっては、本コマンドと同じ組み込みのechoコマンドを提供しているものもある。

実行例

# echo hello              // 通常の文字列を標準出力に書き出す
hello
# echo $PAGER             // 環境変数の値を標準出力に書き出す
jless
# echo $PAGER $TERM zzz   // 複数の文字列を標準出力に書き出す
jless xterm zzz
# echo -n hello           // 改行なしをオプション指定
hello#                    // 改行されずプロンプトが表示される

whichコマンド

コマンド名のリストを受け取り、対応する実行形式ファイルのパスを返す。

オプションは以下の通り。

  • -a : (最初に見つけたものだけでなく)みつけたすべての実行形式を表示する。
  • -s : 実行形式が見つかれば 0 を返し、見つからなければ 1 を返す。

実行例は以下の通り

# which vi
/usr/bin/vi
# which ls pwd cd    // 複数のコマンドの実行形式ファイルを探す
/bin/ls
/bin/pwd
/usr/bin/cd

「-a」オプションの実行例

# sudo touch /usr/bin/sample
# sudo chmod 755 /usr/bin/sample
# sudo touch /usr/local/bin/sample
# sudo chmod 755 /usr/local/bin/sample
# which sample         // 最初に見つかった実行形式ファイルのみ表示される
/usr/bin/sample
# which -a sample      // 見つかったすべての実行形式ファイルが表示される
/usr/bin/sample
/usr/local/bin/sample

シェル

シェルとは、ユーザーが入力したコマンドを解釈してカーネルに処理を依頼するためのアプリケーション。通常、シェルは各ユーザがログインする度に起動され、ログアウトの際に終了する。ログインすると、端末上にプロンプトを表示する。プロンプトとはユーザへコマンドの入力を促す記号で、例えば "woody$" のように表示される。UNIXライクなOSではシェルがユーザプログラムとして実装されており、好きなシェルを選んで使用することができる。

シェルの機能

(1) コマンドの解釈・実行(コマンドインタプリタ

シェルの一番基本的な機能。ユーザがキーボードから入力したコマンドの解釈を行い、コマンドとして入力された名前のプログラムを探し出して起動する。このようなコマンドの逐次解釈を行うプログラムをコマンドインタプリタと言います。この機能はどのシェルも持っています。

lsコマンドやcpコマンドなどは、プログラムファイルが存在しシェルはそれを探し出して起動する。中には、pwdコマンドやcdコマンドのように独立したファイルではなくシェル内部に組み込まれたコマンドもある。こういったコマンドはシェルコマンドと呼ばれる。

(2) コマンド履歴の記録(ヒストリ)

入力・実行されたコマンドの履歴を記録する機能。history コマンド(シェルコマンド)を利用して過去に実行したコマンドとその実行時刻を確認することができる。

(3) コマンド入力・編集の支援

ヒストリ機能を利用して、過去に実行したコマンドをコマンドライン上に再度呼び出すことができる。過去に入力した長いファイル名などを再度入力する手間が省ける。

  • ひとつ前のコマンドを呼び出す  Ctrl-p または上矢印 (↑)
  • ひとつ次のコマンドを呼び出す  Ctrl-n または下矢印 (↓)
(4) リダイレクトとパイプ

リダイレクトは、コマンドの出力をファイルに書き出したり、既にあるファイルに書いてある内容をキーボード入力の代わりに利用する機能。

リダイレクトの書式

コマンド > ファイル名   // 新しくファイルを作成してコマンドの出力を保存
コマンド >> ファイル名  // 既存のファイルの末尾にコマンドの出力を追加
コマンド < ファイル名   // ファイルの内容をコマンドに入力

パイプは、あるコマンドの出力を別のコマンドに入力する機能。このパイプを利用することで、複数のコマンドを組み合わせた処理を簡単に行えます。パイプを複数使えば、幾つものコマンドを連携させて実行させることも可能。

パイプの書式

コマンド1 | コマンド2    // コマンド1の標準出力をコマンド2の標準入力とする
(5) メタキャラクタの解釈

シェルでは、*(アスタリスク)や?(クエスチョンマーク)は特別な意味で扱われ解釈される。これらをメタキャラクタと呼ぶ。*(アスタリスク)は任意の長さ(長さ0を含む)を持つ文字列を表す。例えば、a* と書けば「aで始まる文字列(aのみを含む)」と解釈される。この * は特別にワイルドカードとも呼ばれる。たくさんのファイル名を一度で扱いたい場合などに便利。?(クエスチョンマーク)は任意の1文字を表す。例えば、a??.txt と書けば、「aで始まって2文字続いた後に.txt で終わる文字列」と解釈される。

(6) その他の機能
  • 環境の設定: シェル変数や環境変数を用いてユーザ独自の環境を設定できる
  • ジョブ管理: ジョブとは、コマンド行より1行で入力された処理のこと。コマンド行の後に&を入力すると、バックグラウンドジョブとして実行することができる。これをうまく利用することで、効率よく作業することができる。
  • 連続処理: 複数のコマンドを;でつないで入力して一度に実行することで、コマンドを連続して処理させることができる。ただしパイプとは違い、前のコマンドの出力を次のコマンドに渡すわけではない。
  • コマンドファイル(シェルスクリプト): コマンドファイルは一連のコマンドを書き込んだファイルであり、それを呼び出すと一連の操作をキーボードから入力する代わりに、ファイルの記述内容を順次解釈して実行します。if 文や while 文など制御文が利用でき、C言語で行うような複雑な処理もプログラムとして作成することが可能。

シェルの種類

  • sh (Bourne shell): 現在利用できるもっとも古いシェル。 AT&Tベル研究所で開発され、 開発者の1人であるSteven Bourne 氏にちなんで名付けられた。ほとんど全てのUNIXで利用できる標準的なシェルであるため、シェルスクリプトの作成にはよく用いられる。
  • csh (c shell): FreeBSDの標準シェル。シェルスクリプトを書くときの構文がC言語に似ていることからこの名前が付けられている。 Bourneシェルに比べ、ヒストリー機能やジョブ制御、 エイリアスなどの機能が付加されており、対話形式で使用する場合に便利である。
  • bash (Bourne Again shell): Linuxの標準シェル。その名前は前身のUnixシェルであるBourneシェルとborn again(生まれ変わり)に引っかけた洒落である。コマンド文法はかなりの部分をBourneシェルと後方互換性を持たせている。Bourneシェルにおいて貧弱であった、 ユーザーインターフェイスとしての機能を強化するため、 ヒストリー機能やジョブ制御、 エイリアスなどの機能などが追加されている。
  • その他: csh の拡張版である tcsh(TC shell)や、zshksh などがあります。

現在使用しているシェルの確認方法

# printenv SHELL
/usr/local/bin/bash

シェルの変更方法

% printenv SHELL                  // 変更前のシェルを確認
/bin/csh                          // cshだということがわかる
% chsh -s /usr/local/bin/bash     // chshコマンドを実行してシェルをbashに変更
Password:
chsh: user information updated
% exit                            // ログインし直すと変更後のシェルが起動される
$ printenv SHELL                  // 変更後のシェルを確認
/usr/local/bin/bash               // シェルがbashに変更されたことがわかる

環境変数

環境変数はOSが提供するデータ共有機能の一つ。OS上で動作するプロセスがデータを共有するための仕組み。プロセスに対して外部からデータを与え、プロセスの挙動・設定を変更する際に用いる。環境変数には、システムにより定義されるものとユーザが任意に定義するものがある。慣例として環境変数名には大文字を使う (シェル変数には小文字を使う)。

設定されている環境変数の表示

printenvコマンドを使用する。

# printenv
TERM=xterm
SHELL=/usr/local/bin/bash
USER=root
SUDO_USER=woody
SUDO_UID=1001
PACKAGEROOT=ftp://ftp6.jp.freebsd.org
USERNAME=root
PAGER=jless
FTP_PASSIVE_MODE=TRUE
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/woody/bin
MAIL=/var/mail/woody
PWD=/usr/home/woody
SHLVL=1
SUDO_COMMAND=/usr/bin/su
HOME=/root
LOGNAME=root
LC_CTYPE=ja_JP.eucJP
SUDO_GID=1001
_=/usr/bin/printenv

特定の環境変数の値のみ表示するには、printenvコマンドの引数に環境変数名を指定する。

# printenv HOME
/home/woody

環境変数の設定

環境変数を設定する方法はシェルにより異なる。
shの場合

$ VAR=value
$ export VAR

cshの場合

% setenv VAR value

bashの場合

$ export VAR=value

環境変数の削除

# unset VAR
# printenv VAR
(削除されたため表示されない)

コマンドラインシェルスクリプトから環境変数を参照、

「$環境変数名」とします。

% echo $HOME
/home/woody

環境変数の影響範囲

環境変数の値は自分のログインセッション全体に適用される。つまり環境変数はシェル変数と違って子プロセスに引き継がれる。自分が実行する特定のプログラムからも参照できる。ただし、子プロセスが設定した環境変数は親プロセスには影響を与えないし、全く無関係のプロセス(親子の関係にないプロセス)にも反映されない。

# export VAR=aaa         // 環境変数VARの値にaaaを設定
# printenv VAR           // 環境変数VARの値を表示
VAR=aaa                  // 設定した値aaaが表示された
# bash                   // 新しいシェルを起動して子プロセスを作成
# printenv VAR           // 子プロセスの環境変数VARの値を表示
VAR=aaa                  // 親プロセスの環境変数は子プロセスに引き継がれるため値aaaが表示
# export VAR=bbb         // 子プロセスの環境変数VARの値にbbbを設定
# printenv VAR           // 子プロセスの環境変数VARの値を表示
VAR=bbb                  // 設定した値bbbが表示された
# exit                   // 子プロセスの終了。親プロセスのシェルに戻る。
exit
# printenv VAR           // 環境変数VARの値を表示
VAR=aaa                  // 子プロセス作成前に設定した値aaaが表示された。
                         // 子プロセスで設定した値bbbが親プロセスには影響していない

主な環境変数

  • HOME: ホームディレクトリの絶対パス。(例: /home/woody) 引数なしでcdを実行したときに移動するディレクトリ。
  • USER: 自分のログイン名。(例: woody)
  • SHELL: 現在使用しているシェルの絶対パス。(例: /usr/local/bin/bash)
  • PATH: 入力されたコマンドの実行ファイルを検索する場所。(例: /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/woody/bin)
  • PWD: カレントディレクトリ名。(例: /home/woody/test)
  • TERM: 端末 (ターミナル) の種類。(例: xterm) 端末には文字を表示するだけでなく、1文字戻ったり、1行削除したり、画面をクリアするなどの機能がある。これらはそれぞれ特殊なコードが割り当てられており、これをエスケープシーケンスと呼ぶ。viやemacs等では、1文字戻ったり画面をクリアする際、このエスケープシーケンスを出力している。しかしエスケープシーケンスは端末の種類によって違うので、ユーザが今どの種類の端末を利用しているのか環境変数TERMを参照して調べている。そのため、環境変数TERMが設定されていない状態ではviやemacsは正常に動作しない。
  • PAGER: 標準ページャ。(例: more) manなどを実行したとき、環境変数PAGERに設定されているプログラムがページャとして実行される。
  • EDITOR: 標準エディタ。(例: vi) あるプログラムで自動的にエディタを起動してユーザにファイルの編集をさせるような場合に、環境変数EDITORに設定されているプログラムがエディタとして起動する。vipw、crontab、cvs、less などが参照する。
  • LANG: 使用言語の指定。ロケールとも言う。(例: a_JP.eucJP)

ロケールを日本語に設定した場合のdateコマンドの表示の変化。

# date                                  // 普通にdateコマンドを実行すると
Tue Aug 18 11:38:15 JST 2009            // 英語で現在日時が表示される 
# export LANG=ja_JP.eucJP               // 環境変数LANGに日本語を設定してから
# date                                  // dateコマンドを実行すると
2009年 8月18日 火曜日 11時38分32秒 JST  // 日本語で現在日時が表示される

pwdコマンド

ワーキングディレクトリの表示
現在のワーキングディレクトリを絶対パスで標準出力に出力します。

オプションは以下の通り。

pwdコマンドは環境変数PWDを利用する。環境変数PWDには論理的な現在のワーキングディレクトリが入っている。

/bin/pwd は外部コマンドのpwdだが、シェルによっては組み込みのpwdコマンドを提供しているものもある。bashは組み込みのpwdコマンドが存在するため通常はそちらが使われる。外部コマンドのpwdを使用するには、フルパスで指定するか、.bashrc等にaliasを指定して利用すればよい。外部コマンドのpwdbash組み込みのpwdの違いは、デフォルトのオプション。外部コマンドは-Pがデフォルトで指定され、bash組み込みのpwdは-Lがデフォルトで指定される。

実行例

# pwd
/root/test
# ls -l
drwxr-xr-x  2 root  wheel  512 Aug 18 05:19 aaa
lrwxr-xr-x  1 root  wheel    3 Aug 18 05:19 bbb -> aaa
# cd bbb
# pwd                // bash組み込みのpwdを実行。-Lがデフォルト
/root/test/bbb       // シンボリックリンクの名前が表示される
# /bin/pwd           // 外部コマンドのpwdを実行。-Pがデフォルト
/root/test/aaa       // シンボリックリンクが指している実際のディレクトリ名が表示される。
# /bin/pwd -L        // 外部コマンドのpwdを-Lを指定して実行。
/root/test/bbb       // シンボリックリンクの名前が表示される

cdコマンド

ディレクトリの移動。
シェル組み込みコマンド。実行中のシェルプロセス内で実行される。

実行例

# cd aaa/bbb/ccc    // 特定のディレクトリに移動
# cd ..             // 1つ上のディレクトリに移動
# cd                // 自分のホームディレクトリに移動
# cd ~              // 同上
# cd ~woody         // 特定のアカウントのホームディレクトリに移動
# cd -              // 1つ前にいたディレクトリに移動。便利なのでわりとよく使う。