ユーザーがコマンド行に打ち込んだコマンドを解釈し, 実行させる役割を持つプログラムをシェル (shell) といいます 1。
ユーザーが計算機にログインすると, そのユーザーのためにシェルが動き出します。 これをログインシェルといいます。 ユーザーがコマンドをタイプして実行できるのは, ログインシェルが動いているからです。 シェルには幾つかの種類がありますが,各ユーザーのログインシェルは, 予め計算機の管理者が設定しています。
ログインシェルが何であるかを確認するには finger コマンドが使えます。 ここで
finger usernameを実行してみましょう 2。 username には,自分のユーザー名を指定してください。
この節では,tcsh が持つコマンドの入力支援機能のうち, 知っていて欲しい代表的なものを紹介します。
プロンプトの存在する,コマンド入力のための行をコマンド行 (command line) と呼びます。 tcsh では, GNU Emacs でカーソル移動や文字削除等をするのと同じキー操作で, コマンド行の内容を編集することができます。 コマンド行に何か適当な文字列を打ち込んだ後で以下を試してください。
CTRL-a (行頭), CTRL-b (左), CTRL-f (右), CTRL-e (行末)などが使えます。カーソルの左右移動には,通常,矢印キーも使えます。
なお,カーソルがコマンド行の途中にある状態で <Enter> を押すと,コマンド行 の全体が実行されますので,コマンド実行の前にカーソルを行末まで移動する必 要はありません。
コマンド行の文字を消去するときには,<BackSpace> や <Delete> 以外に GNU Emacs のキー操作も使えます。よく使うのは次のものでしょう。
CTRL-d (カーソル位置の一文字削除), CTRL-k (カーソル位置から行末まで消去; kill)
現在編集中のコマンド行を実行せずに,新しいプロンプトを出すには,
CTRL-cを打ちます。
GNU Emacs における 領域(リージョン)指定や,領域消去,領域複写, 貼り付け (再入;yank) もコマンド行でできます。 GNU Emacs のキー操作に慣れている人は試してみましょう。
GNU Emacs におけるカーソルの上下移動のキー操作は,コマンド行では次の意味 を持ちます。
CTRL-p (一つ前のヒストリを表示), CTRL-n (一つ先のヒストリを表示)通常,これらの代わりに上下の矢印キーも使えます。
CTRL-p を一回押すと, 一つ前に実行したコマンド行の内容が表示され,続いて CTRL-p を押すと二つ 前に実行したコマンド行の内容が表示されます。このようにヒストリを遡ってか ら,下移動のキー(CTRL-n) を押すと,最近のヒストリに戻っていきます。 この操作でコマンド行に現れた文字列はカーソル移動や消去,貼り付けによって 編集し,実行することができます。
コマンド行にコマンドやファイル名の始めの一部だけを入力して, 残りをシェルに自動的に補わせることができます。
CTRL-d はプロンプトに続いて何か文字列をタイプした後で押してください。 コマンド行で CTRL-d だけを押すと,シェルに対して「入力の終わり」(EOF; end of file) を入力したことになり,設定によっては計算機からログアウトし てしまいます3。
<Tab> 補完 CTRL-d 複数の補完候補がある場合の一覧表示
この章の内容に関するより詳しい説明は,例えば, 昨年度の情報機器の操作テキスト の ディレクトリ や パス名 の資料にあります。
カレントディレクトリの内容が表示される
カレントディレクトリに存在する tmpfile のファイル名が tmpfile.old に変わる。
カレントディレクトリに存在するディレクトリ tmpdir が新しいカレントディレクトリになる。
なお,tmpfile や tmpdir がカレントディレクトリに存在しなければ,mv や cd の実行は失敗します。
ファイル名やディレクトリ名のみを記述すればよい。
パス名 (ディレクトリ/ファイルの階層構造内の位置情報を含んだ, ファイルやディレクトリの名前) として記述する。
ルートディレクトリを基点として, ディレクトリやファイルの位置を表す。
例)
カレントディレクトリとの相対的な関係によって, ディレクトリやファイルの位置を表す。 相対パスでは,カレントディレクトリを . (ドット) で表し, 親ディレクトリを .. (ドット二つ)で表す。 絶対パスとの表記上の大きな違いは,パス名の先頭に / を付けないこと。
例)
付録 A に,よく使う UNIX コマンドが掲載されています。 必要ならば,付録を参照しながら以下を実行してください。 コマンドの詳細が知りたければ man コマンドで調べてください。
>
)
を使うこととします。一般に
command >
file
で,コマンド command の出力を,
ファイル名が file である新しいファイルに格納することができます。
command >>
file
で,コマンドの出力を,既存のファイルfile に追加できます。
親ディレクトリはカレントディレクトリ temp には存在しませんから, ディレクトリ名そのままは使えません... (ドットふたつ) で指定できます。
コマンドを入力する行(コマンド行)の内容を解釈して, コマンドを実行するのはシェルという種類のプログラムでした。 ここでは,コマンドに引数を与えて実行する際に必要となる, シェルにとって特別な意味のある文字の取り扱いを確認します。 また,検索等で必要となる,文字列のマッチングに関する考え方の基礎を習得します。
カレントディレクトリに, 仮に a1,a2, ...,a5 という 5 つの通常のファイルと distdir というディレクトリのみが存在するとし, a1,..., a5 を distdir に移動したいとします。 ファイル移動のコマンドは mv であり,mv の 引数には複数のファイルを指定できますから,
mv a1 a2 a3 a4 a5 distdirを実行すれば希望は叶えられますが, 移動するファイルをすべて列挙するのは面倒です。
この例のように,一度のコマンド操作で複数のファイルを処理したいとき, メタキャラクタ(meta-character)という, シェルにとって特殊な意味のある文字を利用すると便利です。 メタキャラクタを用いると,上記の操作は
mv a? distdir
や
mv a* distdirで済みます。a? と a* は,シェルによって共に a1 a2 a3 a4 a5 に展開 (置き換え) されてから,引数として mv コマンドに渡されます。
? と * は,一言でいえば,
にマッチする4メタキャラクタですが, その具体的な使い方を次の例で見てみます。?
: 任意の1文字
*
: 任意の文字列
A A1 B C a a1 a11 a12 a13 a2 a3 b b1 b11
引数に与えた文字列をそのまま表示するコマンドとして echo がありました。 例えば,
echo abc d eを実行すると,画面に abc d e と表示されます。 このコマンドを使い, ? を含む引数がどのようなファイル名に展開されるのかを調べましょう。
echo ?echo の引数に ? を与えても,? とは表示されません。
echo ??
echo ???
echo ????
シェルは ? をカレントディレクトリに存在する 1 文字からなるファイル名のリストに展開し, 引数として echo コマンドに渡します。 その結果として 1 文字からなるファイル名がすべて表示されます。
同様に,?? は 2 文字の, ??? は 3 文字のファイル名に展開されます。 4 文字のファイル名をもつファイルはカレントディレクトリに存在しないので, 最後の例では,その旨のメッセージが出ます。
echo a?最初の例では,ファイル名の先頭が a であって,そのあとに, 何という文字でも構わないから,1文字が続くものに展開されます。 その次の例は, 1 の前後に任意の 1 文字が存在するファイル名に展開されます。
echo ?1?
echo /bin/????だと,/bin というディレクトリに存在するファイルのうち, 4 文字のファイル名をもつものが該当します。
なお,? はファイル名の先頭にある . や,パス名の区切り記号 / にはマッチしません。
* は ? に似ていますが,1 文字のみではなく, 任意の長さの文字列にマッチする点が異なります。
次の例は,各々 a と a1 で始まるファイル名に展開されます。
echo a*最初の例で注意すべきは, 展開されたファイル名の中に a が含まれていることです。 すなわち,任意の長さには,0 文字の長さも含みます。 同じ理由から,2 番目の例でも,a1 が結果に含まれます。
echo a1*
次の結果も,容易に予想できるでしょう。
echo *3
echo *
echo /bin/*
なお,? の場合と同様に,* はファイル名の先頭にある . や, パス名の区切り記号 / にはマッチしませんので, これらは明示的に記述する必要があります。 例えば,カレントディレクトリに存在する . で始まるファイル名をすべて扱うには .* とする必要があります。
以上,? や * がどのようなファイル名に展開されるのかを調べるために,echo コマンドのみを使ってきましたが, メタキャラクタはシェルが解釈する特殊文字なので, コマンドの引数一般に利用することができます 5。
例えば,カレントディレクトリに存在する a で始まるファイルを調べたければ, ls a* を実行するのが自然でしょう。なお,ls の引数にファイル名を与 えると,そのファイルの情報のみが表示されます。
ファイル名やディレクトリ名に展開される,
*
や ?
以外のメタキャラクタとして,次のものもあります。
これらは次のように使います。
~
ホームディレクトリ (csh 系のシェルで利用可能) [
c1c2...]
[ ]
内の1文字([
c1-
c2]
を用いて文字範 囲を指定することも可能){
string1,string2, ...}
{ }
内の文字列
echo ~ ls ~ echo ~/a* echo [abc] ls [abc] echo [A-Z]* echo /{bin,usr,var} ls /{bin,usr,var}
[abc]
は a, b, c のいずれかのファイル名に,
[A-Z]*
は大文字で始まるファイル名に展開されます。
/{bin,usr,var}
は /bin /usr /var
に展開されます。
echo コマンドを使って,画面に What is your name? と表示するにはどうすれ ばいいでしょう。
echo What is your name?を,結果を予想してから実行してみましょう。
メタキャラクタである ? を,普通の文字として echo コマンドで出力するには, シェルによる ? の展開を抑止(エスケープ)してから,echo コマンドの引数に 与える必要があります。
また,シェルが特殊な意味を持つ記号として解釈する文字には,
$
や "
,空白等,これまでに紹介した以外にも存在します。
コマンド行において,それらを普通の文字として扱う場合にも,
次のようにして特殊文字の持つ意味を無効にする必要があります。
\c
'string'
echo What is your name\?前者の場合,echo の引数が 4 個であるのに対し,後者では一つです。
echo 'What is your name?'
時間に余裕があれば, tcsh のオンラインマニュアルを読むことも有意義です。
これらを実際に行うために必要なファイル等を, echo コマンド等で作成してから, 実際に操作を試してください。
(ヒント:ファイル名には空白文字を含めることも可能です。 ただし,この問を解く以外の場面では推奨しません。)
分類 | コマンド | 機能 |
オンラインマニュアル | man command | command のマニュアルを表示 |
ディレクトリ操作 | cd [directory] | カレントディレクトリを directory に変更 (directory を省略した場合はホームディレクトリに変更) |
pwd | カレントディレクトリ名を絶対パス名で表示 | |
mkdir directory ... | directory ...の作成 | |
rmdir directory | 中身が空の directory を削除 | |
mv directory1 directory2 | directory1 の名前を directory2 に変更 | |
rm -r directory ... | directory ... をディレクトリ階層を含めてすべて削除 | |
ファイル・ディレクトリ操作 | ls [file ...] | カレントディレクトリに存在するファイルの名前を表示する。 file ...が指定された場合,その名前を表示する。 file ...がディレクトリである場合,その中のファイル名を表示する。 |
ls -F [file ...] | ファイルの種類を表す記号を付加 | |
ls -a [file ...] | ドットで始まるファイルを含めて表示 | |
ls -l [file ...] | 詳細情報を表示 | |
cp file1 file2 | file1 を file2 に複写 | |
cp file ... directory | file ... を directory に複写 | |
mv file1 file2 | file1 の名前を file2 に変更 | |
mv file ... directory | file ... を directory に移動 | |
rm file ... | file ... を削除 | |
cat files | files の内容を表示 | |
その他 | finger [user] | 同じ計算機を利用しているユーザー (または user) の情報を表示 |
whoami | 私はだーれ | |
echo string ... | string ... を画面に表示 |