シェル、ディレクトリ、Emacsの補完

					2011年05月06日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2011/2011-05-06
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■シェル

コマンド・インタプリタともいう。

◆オペレーティング・システムの中の位置づけ

カーネルを取り囲んでいる殻。

図? アプリケーション、シェル、カーネル、ハードウェアがリング状になっている。

図? シェルの位置づけ(リング)

◆入出力

入力
プログラムが実行する時に受け取るデータ。 (引数、オプションに加えて)ファイルからも受け取れる。
出力
プログラムの実行結果
シェルの機能として、画面を出力をファイルに保存したり、キーボードの代わ りにファイルに保存されたデータを与えたりできる。

◆標準入出力

Unix では、文字端末で動くプログラムは次の3種類をあてにしている。
標準入力 (stdin, standard input, 0番)
普通、キーボードにつながっている。
標準出力 (stdout, standard output, 1番)
普通、画面につながっている。
標準エラー出力 (stderr, standard error output, 2番)
普通、画面につながっている。
標準エラー出力は、標準出力がファイルに切り替えられた時でも、エラー・メッ セージが画面に表示されるために使われる。

◆標準入出力の切り替え(redirection リダイレクション)

シェルは、「記号>」 があると、標準出力を画面から指定されたファ イルに切り替えて、指定されたプログラムを実行する。
$ ls -l > file1 [←]
シェルは、「記号<」 があると、標準入力をキーボードから指定され たファイルに切り替え、指定されたプログラムを実行する。
$ cat < file1 [←]
シェルは、「記号|」があると、次の動作を行う (パイプ(pipe)機能)。 例:
$ ls -l | head -4 [←]
total 222
drwx------  10 yas  prof   4096  4 26 18:51 Desktop
drwx------   4 yas  prof   4096  4  2 14:14 Documents
drwxr-xr-x@  2 yas  prof   4096  4 26 12:51 Downloads
$ []
ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ ばならない。
$ ls -l > file [←]
$ head -4 < file [←]
total 222
drwx------  10 yas  prof   4096  4 26 18:51 Desktop
drwx------   4 yas  prof   4096  4  2 14:14 Documents
drwxr-xr-x@  2 yas  prof   4096  4 26 12:51 Downloads
$ rm file [←]
$ []
パイプは、3つ以上のプログラム(プロセス)を結びつけることもできる。

◆標準エラーの役割

標準出力の切り替えを行ったとしても、標準エラーは画面に表示される。
$ ls Document > file [←]
ls: Document: No such file or directory
$ cat file [←]
$ []
Document」 は、「Documents」の打ち間違い(sがない)である。 ls コマンドは、エラー・メッセージを標準出力ではなく標準エラー出力に書き 出す。

2>file」をつかうと、標準エラー出力をファイルに保存 することもできる。

$ ls Document > file 2>file2 [←]
$ cat file [←]
$ cat file2 [←]
ls: Document: No such file or directory
$ []
2>&1」をつかうと、標準エラー出力(2)を、標準出力 (1)に混ぜて(&)、ファイルに保存することもできる。
$ ls Document > file 2>&1 [←]
$ cat file [←]
ls: Document: No such file or directory
$ []
2>&1」は、順番が大事。ファイルに混ぜて保存する場合 は、「>file」の後にやること。先にやると、その時点で の標準出力(画面)が指定されてしまう。
$ ls Document 2>&1 > file  [←]
ls: Document: No such file or directory
$ cat file [←]
$ []
2>&1を使うと、エラー・メッセージも含めてパイプに出力 することもできる。この場合は、パイプ|より左に書く。
$ ls Document 2>&1 | head -4 [←]
ls: Document: No such file or directory
$ []

◆ファイルの追記

標準出力では、ファイルを追加することができる。
>file
ファイルがなければ、まず空のファイルを作成する。ファイルがあれば、 file の内容を消して空にする。
>>file
ファイルが存在しても、消さずにその後ろに追加する。

■ファイル名置換

ファイル名の一部だけをキーボードから打ち込み、 残りの部分をシェルに探させる。

補完(completion)では、人間が目で確認するが、置き換えでは人間が確認する ことはない(見つからなければエラーになる)。

例:/usr/bin にある at で始まるファイルをすべて ls コマンドに引き渡したい。1つひとつ打つと疲れる。

$ ls /usr/bin/at /usr/bin/atos /usr/bin/atq /usr/bin/atrm /usr/bin/atsutil [←]
/usr/bin/at             /usr/bin/atq            /usr/bin/atsutil
/usr/bin/atos           /usr/bin/atrm
$ []
次のように、「*」を使うと楽に打てる。
$ ls /usr/bin/at* [←]
/usr/bin/at             /usr/bin/atq            /usr/bin/atsutil
/usr/bin/atos           /usr/bin/atrm
$ []
この例では、シェルが「/usr/bin/at*」を5つのファイル名に置き換え ている。ls が行っているのではない。ls以外のどんなプログラ ムでも有効である。
$ echo /usr/bin/at* [←]
/usr/bin/at /usr/bin/atos /usr/bin/atq /usr/bin/atrm /usr/bin/atsutil
$ file /usr/bin/at* [←]
/usr/bin/at:      setuid Mach-O fat file with 3 architectures
/usr/bin/atos:    Mach-O fat file with 2 architectures
/usr/bin/atq:     setuid Mach-O fat file with 3 architectures
/usr/bin/atrm:    setuid Mach-O fat file with 3 architectures
/usr/bin/atsutil: Mach-O fat file with 3 architectures
$ []

◆ファイル名置換でよく使われるパタン

bash では、「*」を含めて、次のようなパタンが使える。
パタン 意味
* 任意の文字列(空でもよい)(.で始まるものを除く)
? 任意の1文字
[str] strのなかの1文字。たとえば [aA] は、a か A とマッチする。「-」があると、ASCIIでその間の文字を意味する。たとえば [0-9](数字)や[a-zA-Z](アルファベット)がよく使われる。
{str1,str2,...} 「,」で区切られたパタン str1, str2, ... を順にファイル名置換した結果を並べたもの
~username ユーザusernameのホーム・ディレクトリの絶対パス。
~/ 自分自身のホーム・ディレクトリ
~ 自分自身のホーム・ディレクトリ

よく使われる形式

*
全てのファイル名。
*.txt
最後が .txt で終わるもの。
file[0-9]
数字で終わるファイル名
[a-z]*
英小文字で始まるファイル名
[Ww]ork
work または Work
注意:「*」と「*.*」は違う。Windowsで「*.*」と書く 所、Unixでは、「*」で十分なことが多い。

◆空白文字を含むファイル名

ファイル名に空白文字を含んでいると、そのままではうまく扱えない。
$ ls -ld /Applications/QuickTime Player.app/ [←]
ls: /Applications/QuickTime: No such file or directory
ls: Player.app/: No such file or directory
$ [←]
「?」や「*」で置き換え可能な場合が多い。
$ ls -ld /Applications/QuickTime?Player.app/ [←]
drwxr-xr-x  3 root  wheel  102 11 14 23:31 /Applications/QuickTime Player.app/
$ ls -ld /Applications/QuickTime*Player.app/ [←]
drwxr-xr-x  3 root  wheel  102 11 14 23:31 /Applications/QuickTime Player.app/
$ []
バックスラッシュ「\ 」を使うこともできる。
$ ls -ld /Applications/QuickTime\ Player.app/ [←]
drwxr-xr-x  3 root  wheel  102 11 14 23:31 /Applications/QuickTime Player.app/
$ []

■ヒストリ機能

bash には、過去に打ち込んだコマンドを記憶して再現する機能がある。 bash では、コマンド行の編集機能があるので使わなくてもよいが、次の ことは理解しておく必要がある。

◆historyコマンド

過去に打ち込んだコマンドの一覧を表示する。
$ history [←]
    1  saykotoeri2 
    2  saykotoeri2 
    3  fg
    4  dup
...
  500  history
$ []

◆利用

bash では、Emacs の ^P / ^N で、ヒストリを さかのぼれる。

その他に、次のような方法もある。bash では、ほとんど使われない。編集機能 がないシェルでは有効であった。

!!
直前のコマンドの再実行
!10
history で表示される 10番のコマンドの実行
!-2
現在からさかのぼって2個前のコマンドの実行。!-1 は、!! と同じ。
!str
先頭が str から始まるコマンドで、最も最新のもの。
!?str
文字列 str を含むコマンドで、最も最新のもの。
^old^new
直前のコマンドの old を new で置き換えたもの。打ち間違いの修正。
!*
直前のコマンドの引数(コマンド名以外)
利用例:
$ ls file.txt [←]
file.txt
         ここで -l を付けわすれたのに気がつく
$ ls -l !$ [←]
ls -l file.txt
-rw-r--r--  1 yas  prof  9  4 29 21:23 file.txt
$ []

■ファイルとディレクトリの木構造とパス名

◆木構造

木構造(tree structure)というのは、コンピュータ・サイエン ス(情報科学類で学ぶ学問)でよく使われる用語。 階層構造(hierarchical structure)ともいう。

木構造の例を、大学の組織を使って説明する(図?)。

木構造という名前は、本物の木が、一度枝分かれした後は決して交わらないこ とに似ていることによる。ある節から別の節までの道が2通り以上あるは、グ ラフ構造と呼ばれる。

筑波大学、社会・国際学群・・・情報学群、情報科学類・・・

図? 大学組織に見られる木構造

筑波大学、社会・国際学群・・・情報学群、情報科学類・・・(領域的な見方)

図? 大学組織に見られる木構造(領域的な見方)

◆字下げによる木の表現

木構造を字下げで表すことがある。

筑波大学

◆区切り文字入り表記

「情報科学類」という節を、次のように表記する。

筑波大学情報学群情報科学類

コンピュータの中で、文字列(文字の並び)で木構造上の位置を表現する時に は、節が分かりやすくために、はっきりと区切りを入れて表現することがよく 行われる。

筑波大学.情報学群.情報科学類
筑波大学/情報学群/情報科学類
情報科学類.情報学群.筑波大学

区切り文字としては、「.」(点)、「/」(スラッシュ)、「\」(バック スラッシュ)、「¥」(円記号)などがよく使われる。単語を並べる時に、木 の根に近いほうから書く流儀と遠い方から書く流儀がある。

◆木の例

コンピュータでは、次のような場所で木構造が使われている。

コンピュータ以外では、次のような場所で木構造が使われている。

◆くわしくは

総合科目「ネットワーク社会を支える情報技術入門 II」/木構造(2009年9月24日)

http://www.softlab.cs.tsukuba.ac.jp/~yas/gen/it-2009-09-24/

◆ディレクトリの木構造

Unix(MacOSX, Linux含む)やMS Windows では、 ファイルの名前を、基本的には 木構造(tree structure,きこうぞう) という考え方で整理する。 木構造は、 階層構造(hieratical structure) とも呼ばれる。

根が上にある本物の木

図? 本物の木

根、home、etc、user、kernel、yas、中間節、端説、リンクからなる構造

図? ファイルとディレクトリの木

◆ルート・ディレクトリ(the root directory)

本物の木に根にあたるディレクトリ。

ルート・ディレクトリの名前は、「/」 (スラッシュ 1 文字)。

◆パス名

Unix では、ファイルやディレクトリの名前を付ける時に、木構造で考えてそ のファイルやディレクトリにたどり着くための道順を使う。 このような名前をパス名(path name) という。 パス(path)とは「道」の意味。pass ではない。

ルートディレクトリから出発する方法で表記するパス名を、 絶対パス名(absolute path name)

絶対パス名は、ルートディレクトリを表す「/」の後に、 たどった枝の名前を並べ、間に区切りとして「/」をはさむ。

例:「/usr/bin/wc

  1. ルート・ディレクトリから出発する
  2. usr」という枝に進む
  3. bin」という枝に進む
  4. wc」という枝に進む

◆カレントワーキングディレクトリ

ルート・ディレクトリを起点にする方法(絶対パス名)だけでは、作業しにくい。 「現在作業中のディレクトリ」 「カレント・ワーキング・ディレクトリ(the current working directory)」 を起点として、ファイル名を扱う。

カレント・ワーキング・ディレクトリを表示するには、pwd (print working directory) コマンドを使う。

$ pwd [←]
/USA/California
$ []
表示されている「/USA/California」が絶対パス名で表示されたカレント・ワー キング・ディレクトリの名前。

カレント・ワーキング・ディレクトリを変更するには cd (change directory) コマ ンドを使う。

$ cd dirname [←]
「ディレクトリ dirname に行く」とも言う。

$ pwd [←]
/USA/California
$ cd /USA/Florida [←]
$ pwd [←]
/USA/Florida
$ cd /USA/California/San-Francisco [←]
$ pwd [←]
/USA/California/San-Francisco
$ []

カレントワーキングディレクトリは、名前「.」で参照できる。

lsコマンドは引数にディレクトリを指定すると、そのディレクトリの中にある ファイルの一覧を表示するが、引数を与えないと、「.」が与えられたものとし て働く。

$ ls [←]
Los-Angeles  San-Francisco
$ pwd [←]
/USA/California
$ ls /USA/California [←]
Los-Angeles  San-Francisco
$ ls . [←]
Los-Angeles  San-Francisco
$ []

カレントワーキングディレクトリを起点としたパス名を 相対パス名(relative path name)という。 「/USA/California」の時、 「San-Francisco」は「/USA/California/San-Francisco」、 「San-Francisco/China-Town」は「/USA/California/San-Francisco/China-Town」を意味する。

◆ディレクトリの親子関係

親ディレクトリ(parent directory)
あるディレクトリの ルート・ディレクトリからそのディレクトリへの道順で1つだけ 根に近いディレクトリ。 1個上のディレクトリともいう。 「..」で参照可能。
子ディレクトリ(child directory), サブディレクトリ(subdirectory)
あるディレクトリの、1つ根から遠いディレクトリ
隣のディレクトリ、兄弟のディレクトリ
共通の親ディレクトリを持つディレクトリ。 「../ディレクトリ名」で参照可能。

◆ホーム・ディレクトリ(home directory)

個人所有のファイルを保存する時に起点となるディレクトリ。

cd コマンドに引数を与えないと、ホーム・ディレクトリにもどる。

多くのシェル(csh,tcsh,bash,zsh) やEmacsなどでは、 ホームディレクトリを「~」で指定できる (指定できないプログラムもある。)

」は、ASCIIの形。 JIS では、「」となることがある。

他人のホーム・ディレクトリは、「~ユーザ名」で指定できるプログラムがある。 (指定できないもプログラムもある。)

~xxx」と「~/xxx」のように 「~」直後に「/」の有無で意味が違う。

/ がなく、アルファベットで始まる(~xxx)
他のユーザのホーム・ディレクトリ。 xxx はユーザ名として解釈される。
/ がある ~/xxx
自分のホーム・ディレクトリ以下のファイル(またはディレクトリ)。 xxx はファイル名、または、ディレクトリ名として解釈される。
/ がなく、数字で始まる(~1、~2、・・・、など)
bash では、ディレクトリスタックの上から num 番目を参照。 The Unix Super Text 上巻 11.10 ディレクトリスタック 参照

◆ls -aコマンドによる「.」から始まるファイルの表示

ls コマンドは、標準では、カレント・ワーキング・ディレクトリを意 味する「.」や親ディレクトリを意味する「..」を含めて、 「.」から始まるファイル名を表示しない。-a オプションを付 けると、「.」から始まるファイル名も表示する。ホーム・ディレクト リには、「.」で始まるファイルがいくつか存在する。
$ ls [←]
Desktop         Library         Music           Public          WinFiles
Documents       Movies          Pictures        Sites           public_html
$ ls -a [←]
.                       .cshrc~                 Movies
..                      .emacs                  Music
.CFUserTextEncoding     .emacs.d                Pictures
.DS_Store               .login                  Public
.Spotlight-V100         .profile                Sites
.Xauthority             .ssh                    WinFiles
.backupfiles2006        Desktop                 public_html
.bashrc                 Documents
.cshrc                  Library
$ []

◆cp file dir

cp コマンドには、コピー先にディレクトリを指定することができる。
$ cp file1 file2 dir [←]
この場合、dir 以下に、(一番葉の部分だけ)同じ名前のファイルが作られる。 次の操作と概ね同じ動作をする。
$ cp file1 dir/file1  [←]
$ cp file2 dir/file2 [←]

ディレクトリを指定する時には、カレント・ワーキング・ディレクトリ 「.」 や ホーム・ディレクトリ「〜」も使える。

$ cp /etc/group . [←]
$ cp /etc/group ~ [←]

◆属性

ファイルの属性は、ls -l で調べられる。 ディレクトリの場合、一番左側に directory を意味する d がつく。 詳しくは、 ファイルの属性 を復習しなさい。

■ディレクトリの操作

作成(後述)、内容の表示、名前の変更、削除(後述)がある。

◆ディレクトリの作成

mkdir (make directoryr)コマンドを使う。
$ mkdir dirname [←]
この結果、dirnameという名前のディレクトリが作らる。

◆ディレクトリの内容の表示

ディレクトリに含まれるファイルの名前や子供のディレクトリの名前は、 ls コマンドで表示できる。
$ ls dirname [←]
この結果、ディレクトリdirnameの中(下)にあるファイルと ディレクトリの名前が表示される。

◆ディレクトリ名の変更

mvコマンドは、ディレクトリの名前を変更するために使える。

$ mkdir dir1 [←]
$ ls  [←]
dir1
$ mv dir1 dir2 [←]
$ ls  [←]
dir2
$ []

◆ディレクトリの削除

ディレクトリを削除するには、 rmdir (remove directory) コマンドを使う。
$ rmdir dirname [←]
この結果、 ディレクトリdirnameが削除される。

空でないディレクトリは、rmdir()コマンドでは 「Directory not empty,directorynotempty」 というエラー・メッセージが表示され削除できない。 この場合は、子供のディレクトリやファイル を削除してからもう一度削除する。

■Emacs(2)

◆自動保存(auto-save)

The Unix Super Text 12.3.9 自動バックアップ、自動セーブとリカバリ 参照手引き 3.2.4 参照

Emacs には、C-x C-s で明示的にファイルに保存しなても、ある程度 編集をすると、自動的に保存する機能がある。たとえば、 「file1.txt」 というファイルを編集していると、前後に#が付いた 「#file1.txt#」 というファイルが作られる。レポート提出時にこれを提出してはならない。自 動保存のファイルの文字コードは、EUC でも Shift_JIS でも JIS でも UTF-8 でもなく、Emacs 独自のものである。

◆Emacs補完機能

The Unix Super Text 12.5.1 補完 参照 手引き 3.2.4 ファイル操作 参照

Emacs でファイル名や関数名(M-xの後)を打つ時にも、補完機能がある。 bash の補完機能は、Emacs をまねて作られた。

■実習

実習時間中には、以下の課題をできるだけ多く行いなさい。全部を行う必要は ない。 コマンドの使い方は、The UNIX Super Text、手引きの他に manコマンド で調べる方法がある。

★練習問題(601) ことえりのバックスラッシュ入力

次のようにして、「ことえり」の設定を確認しなさい。そして、キーボードの 「¥」でバックスラッシュが入力されるように設定しなさい。

★練習問題(602) 標準出力の切り替え

次のように、cal コマンドを実行して、>による標準出力の切り替 えが動作することを確認しなさい。
$ cal 5 1011 [←]
      5月 1011
日  月  火  水  木  金  土 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

$ cal 5 1011 > cal-2011-05.txt [←]
$ cat cal-2011-05.txt  [←]
      5月 1011
日  月  火  水  木  金  土 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

$ []

★練習問題(603) bcコマンド

bc コマンドは、電卓のプログラムである。一般的には、キーボードから数式を 読み込み、結果を画面に表示する。これを動作させてみなさい。

動作例:

$ bc [←]
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
10+20[←]
30
^D
$ []
bc コマンドは、プロンプトを表示しないが、ユーザが打ち込んだ数式を行単位 で計算して表示する。終了するには、入力の終わり(end of file) を意味する ^D (Control+D) を押す。コントロール・キーを押しながら、 D キーを押す。

次のような機能が利用できる。

bc に -l オプションを付けると小数が扱える。 詳しくは、man bc を見なさい。

★練習問題(604) 標準入力の切り替え

bc コマンドに対して、ファイルから数式を読み込ませて計算させなさい。 まず、テキスト・エディタ、または、cat 等で数式が含まれたファイルを作成 しなさい。以下は、cat で作成する例である。Emacs を利用して作成してもよ い。
$ cat > expressions [←]
10+20[←]
2^40[←]
^D
$ cat expressions  [←]
10+20
2^40
$ []
次に作成した数式を、 キーボードの代わりにファイルからデータを読み込ませる。
$ bc < expressions [←]
30
1099511627776
$ []

★練習問題(605) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2011-567.txt  [←]
ls: cal-2011-567.txt: No such file or directory
$ cal 5 2011 > cal-2011-567.txt [←]
$ cal 6 2011 >> cal-2011-567.txt [←]
$ cal 7 2011 >> cal-2011-567.txt [←]
$ cat cal-2011-567.txt  [←]
      5月 2011
日  月  火  水  木  金  土 
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

      6月 2011
日  月  火  水  木  金  土 
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

      7月 2011
日  月  火  水  木  金  土 
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
$ []

★練習問題(606) bash補完機能

tcsh の補完機能を利用して、次のファイル名を打ちなさい。
 $ ls /[]
ここまで打ったら、行末で[tab] (^I(Control+I))を1度押してみる。
 $ ls /[tab][]
1度目は何も表示が変わらない。bash や端末の設定によっては、ベルが鳴る。 行末で[tab] をもう一度してみる。
 $ ls /[tab][]
すると、ls と同じような表示がなされる。
 $ ls /
 .DS_Store              Developer/             home/
 .Spotlight-V100/       Library/               local3/
 .SymAVx86QSFile        Network/               mach_kernel
 .Trashes/              Pref-data/             net/
 .file                  System/                opt/
 .fseventsd/            Users/                 private/
 .hotfiles.btree        Volumes/               sbin/
 .metadata_never_index  bin/                   tmp/
 .symSchedScanLockxz    cores/                 usr/
 .vol/                  dev/                   var/
 Applications/          etc/                   
 $ ls /[]
目的の「usr」は、uから始まるものは、1個しかないので 「u」 とうち、[tab] を打つ。
 % ls /u[tab][]
すると、sr/ が補完される。
 % ls /usr/[]
[tab][tab]」([tab]を2回)打つ。
 % ls /usr/[tab][tab][]
すると、/usr の内容が表示される。
 $ ls /usr/
 X11/        bin/        lib/        local/      sbin/       standalone/ 
 X11R6/      include/    libexec/    local3/     share/      
 $ ls /usr/[]
b [tab]」と打つ。
 % ls /usr/b[tab][]
次のように「in/」が補完される。
 $ ls /usr/bin/[]
/usr/bin/」に対して、「[tab][tab]」と打つと、次のように警告される。
 $ ls /usr/bin/[tab][tab]
 Display all 1093 possibilities? (y or n)[]
候補が多すぎるので、ここでは表示はしないでnを打つ。
 Display all 1093 possibilities? (y or n)n
em と入れて [tab] を押す。
 $ ls /usr/bin/em[tab][]
すると、次のように「acs」が補完される。
 $ ls /usr/bin/emacs[]
これで目的のファイルを打ち込むことができた。

★練習問題(607) bash補完機能(コマンド名)

bash には、ファイル名だけでなくコマンド名を補完する機能もある。コマンド ラインの先頭で補完機能を利用すると、ファイル名ではなくコマンド名が補完 される。このことを確かめなさい。この機能を使って、次のようなコマンド名 を打ちなさい。

★練習問題(608) emacs補完機能

The Unix Super Text 12.5.1 補完 参照手引き 3.2.4 ファイル操作 参照

Emacs の補完機能を確認しなさい。

MacOSX で動作する Emacs のバージョンによっては、スペースキーでの補完が 標準ではできないことがある。この時には、タブキーを使うか、次のような設 定を ~/.emacs 等の起動時に実行されるファイルに含める方法がある。 こうすると、ファイル名に空白を使いにくくなる。
(if (boundp 'minibuffer-local-filename-completion-map)
     (define-key minibuffer-local-filename-completion-map
       " " 'minibuffer-complete-word))
(if (boundp 'minibuffer-local-must-match-filename-map)
    (define-key minibuffer-local-must-match-filename-map
      " " 'minibuffer-complete-word))

★練習問題(609) cd、pwd、lsによるディレクトリの観察

次のディレクトリの内容を cd コマンド、pwdコマンド、および、ls コマンド を使って観察しなさい。
$ cd ディレクトリ名 [←]
$ pwd [←]
$ ls [←]
$ ls -l [←]

★練習問題(610) cdコマンドによるホームディレクトリへの移動

次の方法で、ホームディレクトリへ移動してみなさい。

(1) 引数無しで cd コマンドを実行

$ cd / [←]
$ pwd [←]
$ cd [←]
$ pwd [←]
(2) cd コマンドに、「~」を与える。
$ cd / [←]
$ pwd [←]
$ cd ~ [←]
$ pwd [←]
(3) cd コマンドに、「~ログイン名」を与える。
$ cd / [←]
$ pwd [←]
$ cd ~ログイン名 [←]
$ pwd [←]

★練習問題(611) cdコマンドによるホームディレクトリ以下のディレクトリへの移動

ホーム・ディレクトリの下に、どのようなディレクトリがあるかを ls -l で調 べなさい。
$ ls -l [←]
ディレクトリの場合、左端が「d」になっている。 ( ファイルの属性 参照 ) cd コマンドを使って、カレント・ワーキング・ディレクトリを ホーム・ディレクトリの下のディレクトリに変更しなさ い。以下は、Movies に変更した例である。
$ cd [←]
$ pwd [←]
$ ls [←]
$ cd Movies [←]
$ pwd [←]
$ ls [←]
Movies 以外の2〜3のディレクトリについても、類似の操作を行いな さい。

★練習問題(612) ls -aコマンド

ls コマンド(ls -l)、および、ls -a コマンド(ls -al)で、ホーム・ディレク トリを表示しなさい。その違いを観察しなさい。
$ cd [←]
$ ls [←]
$ ls -a [←]
$ ls -l [←]
$ ls -la [←]

★練習問題(613) ls -lRコマンド

ls に -R (Recursively) オプションを付けると、ディレクトリの何か子供のディ レクトリが含まれていた場合、それの子供も含めて全て表示する。ls -lR のよ うに、-l と合わせて使うことが多い。 この機能を確認しなさい。

★練習問題(614) treeコマンド

tree コマンドを利用して、ファイルを木構造が分かりやすいように表示しなさい。

tree コマンドに -N オプションをつけると、ファイル名に漢字を含むものも表 示できる。

$ tree -N ディレクトリ名 [←]
さらに、nkf を使えば、ファイル名を EUC で表示できる。
$ tree -N ディレクトリ名 | nkf -e [←]
nkf コマンドの代わりに lv コマンドを使う方法もある。 (lv コマンドの終了は、q)
$ tree -N ディレクトリ名 | lv [←]
tree コマンドの次のオプションの意味を ls と比較しなさい。 詳しくは、man tree を見なさい。

★練習問題(615) headとtail

head は、ファイルの先頭の 10 行(または、指定された行数) を表示する。 tail は、ファイルの末尾の 10行(または、指定された行数)を表示する。
$ head /etc/services  [←]
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
#
# The latest IANA port assignments can be gotten from
#
#       http://www.iana.org/assignments/port-numbers
$ tail /etc/services  [←]
isnetserv       48128/tcp   # Image Systems Network Services
isnetserv       48128/udp   # Image Systems Network Services
blp5            48129/tcp   # Bloomberg locator
blp5            48129/udp   # Bloomberg locator
#               48130-48555 Unassigned
com-bardac-dw   48556/udp    # com-bardac-dw
com-bardac-dw   48556/tcp    # com-bardac-dw
#                           Nicholas J Howes 
#               48557-49150 Unassigned 
#               49151       IANA Reserved
$ []
このコマンドの動きを確認しなさい。引数として他のファイル名(自分が作成 したレポート等)を指定して実行してみなさい。

★練習問題(616) grep

grep は、引数で指定されたファイル、または、標準入力を検索 し、引数で指定された文字列が存在する行だけを表示するプログラムである。 以下の例は、ファイル「/etc/passwd」の中にある「root」とい う文字を含む行を表示している。
$ grep root /etc/passwd  [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
同じことを、パイプを使っても実行することができる。
$ cat /etc/passwd  | grep root [←]
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$ []
grep コマンドを使って次のようなことを行ってみなさい。

grep コマンドには次のようなオプションを指定することができる。

-v
その行が含まれないものを表示する
-i
大文字小文字を無視する
★練習問題(617) sort sort コマンド は、データを並べ替えるプログラムである。データは、引数で指 定されたファイル、または、標準入力から受け取る。結果は、標準出力、また は、-o で指定されたファイルに書き出すプログラムである。

1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。

$ emacs fruits.txt [←]
$ sort  fruits.txt [←]
$ sort < fruits.txt [←]

ls -l の結果は、ファイル名の順番でソートされている。これをファイルの大 きさでソートしなさい。

$ ls -l | sort -k 5 [←]

sort コマンドでよく使うオプション

-n
数値として比較
-r
逆順でソート
-f
大文字小文字を区別しない
-k 番号
番号で指定されたフィールド以降をソートする。
-o filename
結果を filename に保存

★練習問題(618) パイプ

次のコマンドを実行して、パイプの動作を確認しなさい。

★練習問題(619) lsとパイプ

ls コマンドは、画面に表示する時とパイプに表示する時で表示方法が異なる。 このことを確認しなさい。
% ls [←]
% ls | cat [←]
% ls | lv [←]
パイプに出力する時にも、画面と同様の表示をさせるには、-C オプションを付 ければよい。
% ls -C [←]
% ls -C | cat [←]
% ls -C | lv [←]

★練習問題(620) historyコマンド

history コマンドで、どのようなコマンドを打ち込んできたかを調べなさい。
% history [←]
次の方法で再実行してみないさい。

★練習問題(621) .parentlockの観察

Firefox 実行しなさい。そして、.parentlock というファイルが作成されるこ とを観察しなさい。この時、シェルのファイル名置換機能を使いなさい。
$ ls -l ~/Library/*/Firefox/Profiles/*/.parentlock [←]
-rw-r--r--  1 yas  prof  0  4 27 15:21 /home/prof/yas/Library/Application Support/Firefox/Profiles/019kso7s.default/.parentlock
$ ls -l ~/L[tab] [←]
                   以後、補完機能を使いながら打つ
		   Profiles の下には、.default/があるものを選ぶ
		   そのディレクトリの下では、.p を選ぶ
$ ls -l ~/Library/Application\ Support/Firefox/Profiles/019kso7s.default/.parentlock [←]
-rw-r--r--  1 yas  prof  0  4 27 15:21 /home/prof/yas/Library/Application Support/Firefox/Profiles/019kso7s.default/.parentlock
$ []

★練習問題(622) 長い名前のアプリケーションの実行

/Applications/Calculator.app は、電卓のプログラムである。これをシェルか ら実行するためには、次のように open コマンドに対してパス名を与えればよい。
% open /Applications/Calculator.app [←]
これを、次のような方法を利用して、長い文字列をキーボードから打たないで 実行しなさい。

★練習問題(623) Emacsの自動保存

Emacsの自動保存の仕組みを確認しなさい。
  1. iTerm で端末を 2 つ開く
  2. 片方の端末で emacs を実行する
    $ emacs [←]
    
  3. C-x C-f ファイルを開く(存在しないファイル名をして新規作成する)
    Find file: ~/file.txt[←]
    
  4. emacs に適当な文字を打ち、30秒待つ。 その間にエコー領域(一番下の行)に次のような表示がなされる。
    Auto-saving...done
    
  5. もう1つの端末で、つぎのように打つ
    $ ls *file.txt* [←]
    
    以下は、#file.txt# というファイルが自動的に作られている。
    $ ls  -l *file.txt* [←]
    -rw-r--r--  1 yas  prof  4  4 29 20:44 #file.txt#
    $ []
    
  6. emacs で、C-x C-s でファイルを保存する。
  7. もう1つの端末で、つぎのように打つ
    $ ls *file.txt* [←]
    
    この結果、自動的に保存されたファイルは消え、保存したものだけが現れる。
    $ ls  -l *file.txt* [←]
    -rw-r--r--  1 yas  prof  4  4 29 20:50 file.txt
    $ []
    
  8. 再び、emacs で何か文字を入れ、30 秒待ち、自動保存が行われるのを待つ。
  9. もう1つの端末で、つぎのように打つ
    $ ls *file.txt* [←]
    
    この結果、2つのファイルが現れる。
    $ ls  -l *file.txt* [←]
    -rw-r--r--  1 yas  prof  11  4 29 20:52 #file.txt#
    -rw-r--r--  1 yas  prof   4  4 29 20:50 file.txt
    $ []
    
  10. この状態で、emacs が動作している端末の右上の赤いボタンを押し、 強制的に終了する(普段の動作では行ってはならない)。
  11. もう一度、端末を開き、emacs を実行する。
  12. 2つのファイル(普通に保存したものと自動保存されたもの)がある状態で、 C-x C-f でファイルを開く。
    Find file: ~/file.txt[←]
    
    すると、次のようなメッセージが表示される。
    file.txt has auto save data; consider M-x recover-this-file
    
    一瞬の表示なので、見えない時には、一度C-x k で、そのバッファを消 して、もう一度C-x C-f でファイルを開く。
  13. 上の表示に従い、次のように打つ
    M-x recover-this-file[←]
    
    あるいは
    Esc x recover-this-file[←]
    
    あるいは、C-x C-f でファイルを開く変わり、
    M-x recover-file[←]
    と打ち、# がついていないファイルを指定する。
    Recover file: ~/file1.txt[←]
    
  14. recover-this-file または recover-file の結果、次のように2つの ファイルが表示され、ミニバッファ(一番下の行)に yes/no が問い合わされる。
    -rw-r--r--  1 yas  prof  4  4 29 20:50 /home/prof/yas/file.txt
    -rw-r--r--  1 yas  prof  11  4 29 20:52 /home/prof/yas/#file.txt#
    
    <中略>
    
    -EEE:%%-F1  *Directory*    All L1     (Help View)------------------------------------------
    Recover auto save file /home/prof/yas/#file#? (yes or no)  [←]
    
  15. これに対して yes と打つと、最後の自動保存の結果が復元される。

★練習問題(624) ヒアドキュメント

シェルのヒアドキュメントの機能を使ってみなさい。 The Unix Super Text 上巻 126ページ 参照

■課題6 シェル、ディレクトリ、Emacsの補完

以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。 端末の表示(コマンドの実行結果)は、コピー&ペースト等の機能を使って提出 するファイルに含めなさい。

(1) シェルのファイル名置換機能を使って /usr/bin にある次のようなファイ ルをすべて表示しなさい。結果は、ls または echo コマンドで表示し、コマン ドラインを含めてその結果をレポートに含めなさい。ただし、この課題では、 ls、または、echo コマンドには、必ず絶対パス名を指定しなさい。

(2) 「cd コマンド」、および、シェルのファイル名置換機能を使って /usr/bin にある次のようなファイルをすべて表示しなさい。結果は、ls また は echo コマンドで表示し、コマンドラインを含めてその結果をレポートに含 めなさい。ただし、この課題では、ls、または、echo コマンドには、必ず相対 パス名を指定しなさい。

(3) 次のファイル名(ディレクトリ名も含めたすべて)を、ファイル名置換を使っ てなるべく短く表現しなさい。

短く表現したものを、ls -ld の引数に与えて表示さなさい。
$ ls -ld 短い表現 [←]
drwxr-xr-x@ 4 mac-admin  admin  136  3 24 20:26 /Applications/Firefox.app/
$ ls -ld 短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  3 24 20:27 /Applications/Thunderbird.app/
$ ls -ld 短い表現 [←]
-rwxr-xr-x  1 root  admin  31  4 22  2010 /usr/local3/coins/macosx/bin/firefox
$ []
(4) bash の補完機能を使って、次のファイル名を打ち込み、ls -ld で表示し なさい。この時、どのようなキー操作を行ったかをレポートに書きなさい。
 $ ls -ld キー操作
 $ ls -ld /Applications/Firefox.app/
 $ ls -ld キー操作
 $ ls -ld /Applications/Thunderbird.app/
 $ ls -ld キー操作
 $ ls -ld /usr/local3/coins/macosx/bin/firefox

(5) 次のようなディレクトリとファイルを作成しなさい。

レポートには、どのようなコマンドをどのような引数で実行したのかを書きな さい。iTerm におけるシェルとの対話の様子、または、history コマンドの 結果のうち、必要部分を抜き出したものを含めなさい。 最後に、ls -lRやtree コマンドで表示すると、次のようになるはずである。
$ ls -lR dir1
total 16
drwxr-xr-x  2 yas  prof  4096  5  6 16:11 dir2
drwxr-xr-x  2 yas  prof  4096  5  6 16:12 dir3

dir1/dir2:

dir1/dir3:
total 1
-rw-r--r--  1 yas  prof  6  5  6 16:12 file4
$ tree dir1
dir1
|-- dir2
`-- dir3
    `-- file4

2 directories, 1 file
$ 

(6) [加点] /usr/bin にあるファイルのうち、ファイルファイルのサイズが大 きいもの5 個を表示するコマンドを示しなさい。

最終的に次のような結果が得られるはずである。

$ コマンド [←]
-rwxrwxr-x   1 root   admin    32330912  5  4  2010 clang
-rwxr-xr-x   1 root   wheel    30364288  3  9 00:49 php
-r-xr-xr-x   1 root   wheel    26135456  5 14  2010 emacs
-rwxr-xr-x   1 root   wheel     7802784  5 14  2010 emacs-undumped
-rwxr-xr-x   1 root   wheel     7317488  2 17 21:30 net
$ []

(7) [加点] The Unix Super Text 上巻「11.10節 ディレクトリスタック」を読 み、ディレクトリ・スタックの機能を利用しなさい。そのことを採点者がわか るように、端末の表示(コマンドの実行結果)や history コマンドの結果を示し なさい。ただし、11.10節では、シェルとして tcsh が使われている。coins の 標準のシェルは、bash である。bash と tcsh では、dirs, pushd, popd コマ ンドの使い方は共通であるが、ディレクトリスタックの上から num 番目を参照 する機能が異なる。tcsh で=num の所、bash では ~num になる。


Last updated: 2011/06/16 16:49:02
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>