シェル、Emacs(3)

					2010年04月30日
情報科学類 コンピュータリテラシ

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

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

■連絡事項

■補足

実行と終了、ログインとログアウトの手順を守ること。 得に、emacs はきちんとC-x C-cで終了させること。また、シェルを終 了させても、iTerm は終了していないことがあるので、明示的に終了させる。

■シェル

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

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

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

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

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

◆入出力

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

◆標準入出力

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
ファイルが存在しても、消さずにその後ろに追加する。

■変数

変数(variable)
何かを覚えるためのもの。メモリを抽象化して名前をつけたもの。
変数名(variable name)
変数を区別するための名前
変数の値(value)
変数が覚えているもの
変数の値を参照(reference)
変数の値を取り出すこと
変数に値を代入(assignment)
変数名で変数を指定して、その値を変更する。変数に値をセットする。

◆シェル変数と環境変数

シェル変数
1つのシェル内でのみ有効。
環境変数
実行されるプログラム(子プロセス)に引き継がれる。

◆シェル変数の操作

シェル変数へ代入するには、「変数名=」を使う。
$ X=100 [←]
$ []
参照するには、「$変数名」、または、 「"$変数名"」(ダブルクォートで括る)とする。
$ X=100 [←]
$ echo $X [←]
100
$ echo x"$X"x [←]
x100x
$ []
シェル変数を削除するには、unset コマンドを使う。
$ unset X [←]
$ echo $X [←]

$ echo x"$X"x [←]
xx
$ []
設定されていないシェル変数を使おうとすると、空として扱われる。 注意:シェルのプロンプト($ ) と間違えないこと。シェルのプロンプ ト($ ) は、実際のコンピュータでは、cosmos38:~ i1012345$ のようになっている。

◆環境変数の代入

bash では、シェル変数の変数名を export コマンドに与えることで、 そのシェル変数を環境変数に変える。
$ X=100 [←]
...
$ export X [←]
$ []
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100 [←]
$ []
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($とunset)である。

◆環境変数の利用方法

シェルがプログラムを実行する時、シェル変数は、プログラムへ引き渡されな いが、環境変数は、渡される。環境変数は、プログラムの動作を変更するため に用いる。 以下の例では、環境変数 TZ を設定して、date コマンドの動きを 変えている。
$ date [←]
2010年 4月29日 木曜日 11時29分16秒 JST
$ echo $TZ [←]

$ TZ=EST [←]
$ export TZ [←]
$ echo $TZ [←]
EST
$ date [←]
2010年 4月28日 水曜日 21時29分44秒 EST
$ unset TZ [←]
$ date [←]
2010年 4月29日 木曜日 11時30分10秒 JST
$ []
マニュアルの ENVIRONMENT に記述されている。
% man date [←]
DATE(1)                   BSD General Commands Manual                  DATE(1)

NAME
     date -- display or set date and time

SYNOPSIS
     date [-ju] [-r seconds] [-v [+|-]val[ymwdHMS]] ... [+output_fmt]
     date [-jnu] [[[mm]dd]HH]MM[[cc]yy][.ss]
     date [-jnu] -f input_fmt new_date [+output_fmt]
     date [-d dst] [-t minutes_west]

DESCRIPTION
     When invoked without arguments, the date utility displays the current
     date and time.  Otherwise, depending on the options specified, date will
     set the date and time or print it in a user-defined way.
...
ENVIRONMENT
     The following environment variables affect the execution of date:

     TZ      The timezone to use when displaying dates.  The normal format is
             a pathname relative to /usr/share/zoneinfo.  For example, the
             command ``TZ=America/Los_Angeles date'' displays the current time
             in California.  See environ(7) for more information.

...

◆空白を含むシェル変数

シェル変数や環境変数で、空白を含んでいる(可能性がある)時には、ダブル クォート "" で括ると1単語として扱われる。
$ as="Application Support" [←]
$ echo $as [←]
Application Support
$ ls -ld ~/Library/$as [←]
ls: /home/prof/yas/Library/Application: No such file or directory
ls: Support: No such file or directory
$ ls -ld ~/Library/"$as" [←]
drwx------  14 yas  prof  4096  4 26 12:27 /home/prof/yas/Library/Application Support
$ []

◆メタキャラクタ

シェルが解釈し、コマンドには渡されない文字。 < > | $ { } ( ) [ ] & ; ^ " * ? ~ ' ` 空白 タブ など。

コマンドの引数として渡したい時には、解釈を避ける(エスケープ(escape))た めの特殊な形式を使う。
形式 エスケープ対象 エスケープしないメタキャラクタ
\x \」の直後の一文字 なし (行末の「\」は継続行の意味)
'str' 「'」でくくられた文字列 「'」自身は入れられない。「\'」も効かない。
"str" 「"」でくくられた文字列 「$」, 「`」(バッククォート),「"」(ダブルクォート), 「\」,「!」
\は、ASCII 5c(16進)の文字。表示は、「\」か「¥」。

ダブルクォート "" の内部では、$ は解釈され、シェル変数や 環境変数の置き換えられる。シングルクォート 「''」では、$ は解釈さない。

$ echo "$HOME" [←]
/home/prof/yas
$ echo '$HOME' [←]
$HOME
$ []

■ファイル名置換

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

補完(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では、「*」で十分なことが多い。

■ヒストリ機能

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

◆historyコマンド

過去に打ち込んだコマンドの一覧を表示する。
$ history [←]
    1  saykotoeri2 
    2  saykotoeri2 
    3  fg
    4  dup
...
  500  history
$ []
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE [←]
500
$ []

◆利用

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
$ []

■Emacs(3)

◆自動保存(auto-save)

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

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

◆Emacs補完機能

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

■実習

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

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

次のように、cal コマンドを実行して、>による標準出力の切り替 えが動作することを確認しなさい。
$ cal 5 2010 [←]
      5月 2010
日  月  火  水  木  金  土 
                   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 2010 > cal-2010-05.txt [←]
$ cat cal-2010-05.txt  [←]
      5月 2010
日  月  火  水  木  金  土 
                   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
$ []

★練習問題(602) 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 を見なさい。

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

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

★練習問題(604) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2010-567.txt [←]
ls: cal-2010-567.txt: No such file or directory
$ cal 5 2010 > cal-2010-567.txt [←]
$ cal 6 2010 >> cal-2010-567.txt [←]
$ cal 7 2010 >> cal-2010-567.txt [←]
$ cat cal-2010-567.txt  [←]
      5月 2010
日  月  火  水  木  金  土 
                   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月 2010
日  月  火  水  木  金  土 
       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月 2010
日  月  火  水  木  金  土 
             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

$ []

★練習問題(605) 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[]
これで目的のファイルを打ち込むことができた。

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

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

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

The Unix Super Text 12.5.1 補完 参照

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))

★練習問題(608) シェル変数の確認

setコマンドに引数付けないで実行すると、全てのシェル変数(環境変数含む)の 値が表示される。
$ set [←]
どのようなシェル変数が設定されているか観察しなさい。

★練習問題(609) printenvコマンド

printenvtコマンドに引数付けないで実行すると、全ての環境変数の値が表示さ れる。これを確認しなさい。
$ printenv [←]

★練習問題(610) 環境変数の確認

個々の環境変数の値がどうなっているか、echo コマンドや printenv コマンド で確認することができる。
$ echo $HOME [←]
/home/prof/yas
$ printenv HOME [←]
/home/prof/yas
$ []
注意: printenv の引数には、$ を付けない。

次のような環境変数の値を調べなさい。

注意:環境変数が設定されていないことがある。

★練習問題(611) 環境変数 TZ の動作

次のようなコマンドを打ち、環境変数 TZ の働きを調べなさい。
$ date [←]
$ echo $TZ [←]
$ export TZ=EST    [←]
$ date [←]
$ unset TZ [←]
$ date [←]
$ []
環境変数 TZ/usr/share/zoneinfo/ の下にあるファイル名 を設定して、その動作を確認しなさい。

★練習問題(612) 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
$ []
このコマンドの動きを確認しなさい。引数として他のファイル名(自分が作成 したレポート等)を指定して実行してみなさい。

★練習問題(613) 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
大文字小文字を無視する
★練習問題(614) 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 に保存

★練習問題(615) パイプ

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

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

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

★練習問題(617) シェル変数の操作

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ u=/Applications/Utilities [←]
$ echo $u [←]
/Applications/Utilities
$ ls $u [←]
Activity Monitor.app            Grapher.app
Adobe Utilities.localized       Java Preferences.app
AirPort Utility.app             Keychain Access.app
AppleScript Editor.app          Migration Assistant.app
Audio MIDI Setup.app            Network Utility.app
Bluetooth File Exchange.app     Podcast Capture.app
Boot Camp Assistant.app         RAID Utility.app
ColorSync Utility.app           Remote Install Mac OS X.app
Console.app                     Spaces.app
DigitalColor Meter.app          System Profiler.app
Disk Utility.app                Terminal.app
Expose.app                      VoiceOver Utility.app
Grab.app                        X11.app
$ []

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

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

★練習問題(619) .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
$ []

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

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

★練習問題(621) シェル変数 PS1

シェル変数 PS1 を表示しなさい。
cosmos38:~ yas$ echo "$PS1"
\h:\W \u\$ 
cosmos38:~ yas$ 
この時、ダブルクォート "" を付けないとうまく表示できないことがある。この理由を考えなさい。 シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな さい。
cosmos38:~ yas$ PS1="hi$ "[←]
hi$ []

マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。

man bash の中では、ページャ lv (less) の 「/」 による検索が便利である。

★練習問題(622) 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 と打つと、最後の自動保存の結果が復元される。

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

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

■課題6 シェル、Emacs(3)

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

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

(2) echo コマンドを使って、次の文字列を画面に表示しなさい。

注意:これは、メタキャラクタをエスケープする課題である。単に echo コマ ンドに対してこのような文字列を与えればよいということでない。

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

短く表現したものを、ls -ld の引数に与えて表示さなさい。
$ ls -ld 短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 16 09:29 /Applications/Firefox.app
$ ls -ld 短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 12 11:10 /Applications/Thunderbird.app
$ ls -ld 短い表現 [←]
drwxr-xr-x  3 root  wheel  102  5 21  2009 /Applications/QuickTime Player.app
$ []
(4) 次のファイル名(ディレクトリ名も含めたすべて)を、適当なシェル変数を 設定して短く表現しなさい。 短く表現したものを、ls -ld の引数に与えて表示さなさい。
$ シェル変数の代入1 [←]
$ シェル変数の代入2 [←]
$ シェル変数の代入3 [←]
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 16 09:29 /Applications/Firefox.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 12 11:10 /Applications/Thunderbird.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x  3 root  wheel  102  5 21  2009 /Applications/QuickTime Player.app
$ []
ヒント1: シェル変数への代入は、1回でもよい。

ヒント2: シェル変数の値に空白が含まれている(可能性がある)ものを参照する 時には、ダブルクォートでくくる("$name")とよい。

ヒント3: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。

(5) bash の補完機能を使って、次のファイル名を打ち込み、ls -ld で表示し なさい。この時、どのようなキー操作を行ったかをレポートに書きなさい。

 $ ls -ld キー操作
 $ ls -ld ~/Library/Application Support/Firefox/Profiles/

(6) The Unix Super Text の次の部分を読みなさい。

そして、項目についてついて調べて、簡単に説明しなさい。

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

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

$ コマンド [←]
-rwxr-xr-x   1 root   wheel    29034848  2 11 19:32 php
-r-xr-xr-x   1 root   wheel    26135456  9 10  2009 emacs
-rwxr-xr-x   1 root   wheel     7802784  9 10  2009 emacs-undumped
-rwxr-xr-x   1 root   wheel     7317488  2 11 16:07 net
-rwxr-xr-x   1 root   wheel     6470896  2 11 16:07 rpcclient
$ []
(7) [加点] bash のヒアドキュメント(here document)の機能を使ってみなさい。 シェル変数が展開される方法とされない方法があることを示しなさい。


Last updated: 2010/06/17 15:55:11
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>