データベース入門 資料 1
コマンド行におけるファイル名の記述法と
シェルの特殊文字


目次


1 tcsh のコマンド入力支援機能

ユーザーがコマンド行に打ち込んだコマンドを解釈し, 実行させる役割を持つプログラムをシェル (shell) といいます 1

ユーザーが計算機にログインすると, そのユーザーのためにシェルが動き出します。 これをログインシェルといいます。 ユーザーがコマンドをタイプして実行できるのは, ログインシェルが動いているからです。 シェルには幾つかの種類がありますが,各ユーザーのログインシェルは, 予め計算機の管理者が設定しています。

ログインシェルが何であるかを確認するには finger コマンドが使えます。 ここで

finger username
を実行してみましょう 2username には,自分のユーザー名を指定してください。

この節では,tcsh が持つコマンドの入力支援機能のうち, 知っていて欲しい代表的なものを紹介します。

1.1 コマンド行の編集

プロンプトの存在する,コマンド入力のための行をコマンド行 (command line) と呼びます。 tcsh では, GNU Emacs でカーソル移動や文字削除等をするのと同じキー操作で, コマンド行の内容を編集することができます。 コマンド行に何か適当な文字列を打ち込んだ後で以下を試してください。

1.1.1 カーソル移動

コマンド行でのカーソル移動には
CTRL-a (行頭), CTRL-b (左), CTRL-f (右), CTRL-e (行末)
などが使えます。カーソルの左右移動には,通常,矢印キーも使えます。

なお,カーソルがコマンド行の途中にある状態で <Enter> を押すと,コマンド行 の全体が実行されますので,コマンド実行の前にカーソルを行末まで移動する必 要はありません。

1.1.2 消去

コマンド行の文字を消去するときには,<BackSpace><Delete> 以外に GNU Emacs のキー操作も使えます。よく使うのは次のものでしょう。

CTRL-d (カーソル位置の一文字削除), CTRL-k (カーソル位置から行末まで消去; kill)

現在編集中のコマンド行を実行せずに,新しいプロンプトを出すには,

CTRL-c
を打ちます。

1.1.3 その他

GNU Emacs における 領域(リージョン)指定や,領域消去,領域複写, 貼り付け (再入;yank) もコマンド行でできます。 GNU Emacs のキー操作に慣れている人は試してみましょう。

1.2 ヒストリ(履歴)の利用

GNU Emacs におけるカーソルの上下移動のキー操作は,コマンド行では次の意味 を持ちます。

CTRL-p (一つ前のヒストリを表示), CTRL-n (一つ先のヒストリを表示)
通常,これらの代わりに上下の矢印キーも使えます。

CTRL-p を一回押すと, 一つ前に実行したコマンド行の内容が表示され,続いて CTRL-p を押すと二つ 前に実行したコマンド行の内容が表示されます。このようにヒストリを遡ってか ら,下移動のキー(CTRL-n) を押すと,最近のヒストリに戻っていきます。 この操作でコマンド行に現れた文字列はカーソル移動や消去,貼り付けによって 編集し,実行することができます。


1.3 入力補完

コマンド行にコマンドやファイル名の始めの一部だけを入力して, 残りをシェルに自動的に補わせることができます。

<Tab> 補完
CTRL-d 複数の補完候補がある場合の一覧表示
CTRL-d はプロンプトに続いて何か文字列をタイプした後で押してください。 コマンド行で CTRL-d だけを押すと,シェルに対して「入力の終わり」(EOF; end of file) を入力したことになり,設定によっては計算機からログアウトし てしまいます3

1.3.1 練習

  1. [コマンドの補完] コマンド行に fing とタイプして <Tab> を押してみましょう。 続いて <Enter> を押しましょう。
  2. [補完候補の表示] コマンド行に fin と打ってから <Tab> を押してみましょう。補完されませんね。 続いて CTRL-d を打ってみましょう。
  3. g をタイプしてコマンド行を fing としてから <Tab> を押し てみましょう。続いて <Enter> を押しましょう。
  4. [ファイル名の補完] まず, ファイル .emacs が存在することを確認するために, cat .emacs を実行してファイルの中身を表示してみましょう。 次に, cat .ema に続いて<Tab> を押してみましょう。 コマンド行が cat .emacs になったら,続いて <Enter> を押しましょう。
  5. [パス名の補完] まず,ls /usr/bin を実行して,ディレク トリ /usr/bin (ルートディレクトリ / の下の usr の下の bin ) に存 在するファイル一覧を表示してみましょう。続いて,ls /u<Tab>b<Tab> と打ってみましょう。

2 コマンド行におけるファイル名の記述法

この章の内容に関するより詳しい説明は,例えば, 昨年度の情報機器の操作テキストディレクトリパス名 の資料にあります。

2.1 カレントディレクトリ

なお,tmpfile や tmpdir がカレントディレクトリに存在しなければ,mv や cd の実行は失敗します。

2.2 コマンドに対するファイル/ディレクトリ名の指定方法

  1. カレントディレクトリ内のファイルやディレクトリを扱う場合

    ファイル名やディレクトリ名のみを記述すればよい。

  2. カレントディレクトリ以外のファイルやディレクトリを扱う場合

    パス名 (ディレクトリ/ファイルの階層構造内の位置情報を含んだ, ファイルやディレクトリの名前) として記述する。

    1. 絶対パス名

      ルートディレクトリを基点として, ディレクトリやファイルの位置を表す。

      1. ルートディレクトリは /
      2. ルートディレクトリ以外のディレクトリやファイルについては, 最初の / でルートディレクトリを表し, それ以降,子ディレクトリ(サブディレクトリ) を / で区切って記述する。 この / はディレクトリやファイルの親子関係を表す区切り記号である。

      例)

      • cd / (ルートディレクトリに移動)
      • cd /etc (ルートディレクトリの下の etc ディレクトリに移動)
      • cat /etc/redhat-release (ルートディレクトリの下の etc ディレクトリに存在する redhat-release ファイルの中身を表示)

    2. 相対パス名

      カレントディレクトリとの相対的な関係によって, ディレクトリやファイルの位置を表す。 相対パスでは,カレントディレクトリを . (ドット) で表し, 親ディレクトリを .. (ドット二つ)で表す。 絶対パスとの表記上の大きな違いは,パス名の先頭に / を付けないこと。

      例)

      • cd .. (親ディレクトリに移動)
      • cd ../.. (親ディレクトリの親 (2階層上のディレクトリ) に移動)
      • cd ../../etc (2階層上のディレクトリの下の etc ディレクトリに移動)

2.3 練習

付録 A に,よく使う UNIX コマンドが掲載されています。 必要ならば,付録を参照しながら以下を実行してください。 コマンドの詳細が知りたければ man コマンドで調べてください。

  1. mkdir コマンドを使って,ホームディレクトリの下に db11 というディレクトリを作りましょう。 できたかどうか,ls で確認しましょう。

  2. cd コマンドを使って,今作成したディレクトリ db11 をカレントディレクトリにしましょう。

  3. カレントディレクトリの変更に成功したことを, pwd コマンドで確認しましょう。

  4. echo コマンドを使って,自分のユーザー名 (ログイン名) を画面に表示させてみましょう。

  5. ディレクトリ db11 に, 自分のユーザー名が書かれたファイル myname を作りましょう。 myname の作成には echo コマンドとリダイレクト (>) を使うこととします。一般に
    command > file
    で,コマンド command の出力を, ファイル名が file である新しいファイルに格納することができます。

  6. cat コマンドで,myname の中身を確認しましょう。

  7. myname に自分の氏名を追加しましょう。 一般に
    command >> file
    で,コマンドの出力を,既存のファイルfile に追加できます。

  8. myname の中身を確認しましょう。

  9. ディレクトリ db11 に temp というディレクトリを作り, 正しく作成できたことを確認しましょう。

  10. カレントディレクトリを,今作成した temp に変更しましょう。 この操作が成功したかどうか確認しましょう。

  11. カレントディレクトリを,親ディレクトリである db11 に変更しましょう。

    親ディレクトリはカレントディレクトリ temp には存在しませんから, ディレクトリ名そのままは使えません... (ドットふたつ) で指定できます。

  12. カレントディレクトリを,親ディレクトリである db11 に変更しましょう。 操作が終わったら,カレントディレクトリがどこか,確認しましょう。

  13. ディレクトリ temp を削除しましょう。

  14. ディレクトリ /pub/db に存在するファイル abracadabra の中身を閲覧(表示)しましょう。

  15. ファイル abracadabra を, カレントディレクトリである db11 に複写しましょう。

  16. 15 で複写したファイルの中身に Band という語を追加してください。

3 コマンド行における特殊文字の扱い

コマンドを入力する行(コマンド行)の内容を解釈して, コマンドを実行するのはシェルという種類のプログラムでした。 ここでは,コマンドに引数を与えて実行する際に必要となる, シェルにとって特別な意味のある文字の取り扱いを確認します。 また,検索等で必要となる,文字列のマッチングに関する考え方の基礎を習得します。


3.1 メタキャラクタ

カレントディレクトリに, 仮に 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 コマンドに渡されます。

3.1.1 ? と *

? と * は,一言でいえば,

? : 任意の1文字
* : 任意の文字列
にマッチする4メタキャラクタですが, その具体的な使い方を次の例で見てみます。

  1. 準備
    1. カレントディレクトリを /pub/db/metawork に変更してください。 うまくいったかどうか,pwd コマンドで確認してください。

    2. ls コマンドを使って, カレントディレクトリに存在するファイルを確認してください。 次のファイルがあります。
      A A1 B C a a1 a11 a12 a13 a2 a3 b b1 b11

  2. ? の使い方

    引数に与えた文字列をそのまま表示するコマンドとして echo がありました。 例えば,

    echo abc d e
    を実行すると,画面に abc d e と表示されます。 このコマンドを使い, ? を含む引数がどのようなファイル名に展開されるのかを調べましょう。
    1. 次のコマンドを順番に実行してください。
      echo ?
      echo ??
      echo ???
      echo ????
      echo の引数に ? を与えても,? とは表示されません。

      シェルは ? をカレントディレクトリに存在する 1 文字からなるファイル名のリストに展開し, 引数として echo コマンドに渡します。 その結果として 1 文字からなるファイル名がすべて表示されます。

      同様に,?? は 2 文字の, ??? は 3 文字のファイル名に展開されます。 4 文字のファイル名をもつファイルはカレントディレクトリに存在しないので, 最後の例では,その旨のメッセージが出ます。

    2. ? を他の文字と組み合わせて使うこともできます。
      echo a?
      echo ?1?
      最初の例では,ファイル名の先頭が a であって,そのあとに, 何という文字でも構わないから,1文字が続くものに展開されます。 その次の例は, 1 の前後に任意の 1 文字が存在するファイル名に展開されます。

    3. ? はパス名の一部として使うことができます。 例えば,
      echo /bin/????
      だと,/bin というディレクトリに存在するファイルのうち, 4 文字のファイル名をもつものが該当します。

      なお,? はファイル名の先頭にある . や,パス名の区切り記号 / にはマッチしません。

  3. * の使い方

    * は ? に似ていますが,1 文字のみではなく, 任意の長さの文字列にマッチする点が異なります。

    次の例は,各々 a と a1 で始まるファイル名に展開されます。

    echo a*
    echo a1*
    最初の例で注意すべきは, 展開されたファイル名の中に a が含まれていることです。 すなわち,任意の長さには,0 文字の長さも含みます。 同じ理由から,2 番目の例でも,a1 が結果に含まれます。

    次の結果も,容易に予想できるでしょう。

    echo *3
    echo *
    echo /bin/*

    なお,? の場合と同様に,* はファイル名の先頭にある . や, パス名の区切り記号 / にはマッチしませんので, これらは明示的に記述する必要があります。 例えば,カレントディレクトリに存在する . で始まるファイル名をすべて扱うには .* とする必要があります。

以上,? や * がどのようなファイル名に展開されるのかを調べるために,echo コマンドのみを使ってきましたが, メタキャラクタはシェルが解釈する特殊文字なので, コマンドの引数一般に利用することができます 5

例えば,カレントディレクトリに存在する a で始まるファイルを調べたければ, ls a* を実行するのが自然でしょう。なお,ls の引数にファイル名を与 えると,そのファイルの情報のみが表示されます。

3.1.2 その他のメタキャラクタ

ファイル名やディレクトリ名に展開される, *? 以外のメタキャラクタとして,次のものもあります。

~ ホームディレクトリ (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 に展開されます。

3.2 特殊文字の無効化

echo コマンドを使って,画面に What is your name? と表示するにはどうすれ ばいいでしょう。

echo What is your name?
を,結果を予想してから実行してみましょう。

メタキャラクタである ? を,普通の文字として echo コマンドで出力するには, シェルによる ? の展開を抑止(エスケープ)してから,echo コマンドの引数に 与える必要があります。

また,シェルが特殊な意味を持つ記号として解釈する文字には, $",空白等,これまでに紹介した以外にも存在します。 コマンド行において,それらを普通の文字として扱う場合にも, 次のようにして特殊文字の持つ意味を無効にする必要があります。

  1. 単一の特殊文字 c に対する特殊な意味の無効化
    \c

  2. 文字列 string 内の特殊文字に対する特殊な意味の無効化
    'string'

echo What is your name\?
echo 'What is your name?'
前者の場合,echo の引数が 4 個であるのに対し,後者では一つです。

時間に余裕があれば, tcsh のオンラインマニュアルを読むことも有意義です。

3.3 練習

  1. カレントディレクトリを, ホームディレクトリ内の db11 に変更した上で, ディレクトリ /pub/db/metawork に存在する b で始まる名前のファイルを, 一度の操作で全てカレントディレクトリに複写してください。

  2. echo コマンドを使って画面に What's your name? と表示する方法を考え,いろいろと試してみてください。

  3. cp a b ccp 'a b' c は, 各々,何をするための操作かを考えてください。

    これらを実際に行うために必要なファイル等を, echo コマンド等で作成してから, 実際に操作を試してください。

    (ヒント:ファイル名には空白文字を含めることも可能です。 ただし,この問を解く以外の場面では推奨しません。)


A. UNIX コマンド

表において file ... は複数のファイルを指定できることを表し,[ ] は中の要素が省略可能である ことを表す。file としてディレクトリを指定できるものもある。
分類 コマンド 機能
オンラインマニュアル 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 file1file2 に複写
  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 ... を画面に表示



脚注

... といいます1
これはシェル利用の一形態です。 他の形態でシェルを利用することもあります。
... を実行してみましょう2
または finger -l
... てしまいます3
シェル変数 ignoreeof が設定されていれば,CTRL-d によるシェルの終了は無効です。
... にマッチする4
後に説明しますが,? と * ともに,ファイル名先頭の . (ドット) や / にはマッチしません。
... コマンドの引数一般に利用することができます5
MS-DOS や Windows NT 等では,* や ? はワイルドカード と呼ばれます。Windows NT では,スタートメニューからコマンドプロンプトを 起動すれば,キーボードからのコマンド入力が可能であり,そこでワイルドカー ドを利用できます。ただし,コマンドプロンプトでのワイルドカードは,シェル ではなく,各コマンドが解釈するものなので,ワイルドカードが利用できるかど うかは実行するコマンドに依存します。