シェル(2)、プロセス、電子メールの転送、Emacs

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

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

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

■連絡事項

■補足

レポートは、Emacs の練習も兼ねて、Emacs で書くこと。Emacs が無意識に使 えるようになると、2学期以降のプログラミングで役に立つ。

■シェル変数と環境変数

■変数とは

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

◆シェル変数と環境変数の違い

シェルでは、2種類の変数を使える。
シェル変数
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 [←]
2011年 4月28日 木曜日 14時49分55秒 JST
$ echo $TZ [←]

$ TZ=EST [←]
$ export TZ [←]
$ echo $TZ [←]
EST
$ date [←]
2011年 4月28日 木曜日 00時50分11秒 EST
$ []
マニュアルの 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
$ []

■コマンド行の編集機能とヒストリ機能

◆historyコマンド

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

◆bashのコマンド行の編集機能

bash には、Emacs に似せて、コマンド行の編集機能がある。

◆「!」と「^」

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

◆利用

bash では、 コマンド行の編集機能 で、ヒストリをさかのぼって編集して利用できる。 その他に、次のような方法もある。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
$ []

■プロセス

説明するのは、けっこう難しい。完全な理解には、次のような勉強が必要にな る。

◆プロセスとは

プログラムがメモリに読み込まれ、CPU (processor) により実行できる状態に なったもの。 ←→プログラムは、ディスクにあってもプログラム。

「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ bash だが、プロセスとしては別物になる。

その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)

メモリにプロセスが3つ、UNIXカーネル、ハードディスク、CPU

プログラムとプロセス

◆プロセスの役割

保護の単位
(故意か過失かを問わず) 特に許可を出さない限りプロセスは他のプロセスの 影響(データ見る、データを破壊する、強制終了させる) を受けないようになっている。 あるプロセスの動作がおかしくなっても、 コンピュータ全体としては動作しつづける。
資源割当ての単位
メモリ、ディスク、プリンタ、ディスプレイ、キーボードなどコンピュータが 処理を進める上で利用価値のあるものを総称して 資源(resource) という。 複数のプロセスを動作させる時、資源が不足してきたら、ある基準で分配する。

プロセスの操作

「殺す」と「止める」は違う。 殺したプロセスは、再開できない。 止めたプロセスは、場合によっては、再開できる。

■プロセスを作る==プログラムを実行する

プログラムを実行すると、プロセスが作られる。 例:
$ ls [←]

■プロセスの観察

手引き 2.3.1 参照The Unix Super Text 第10章 参照

プロセスには、ID (identifier)と属性がある。 psコマンド は、プロセスの一覧と属性を表示するコマンドである。

$ ps [←]
  PID   TT  STAT      TIME COMMAND
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.20 emacs
  646 s001  S      0:00.01 -bash
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 最大5桁の番号。
TT 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/ttys001s001になる。
STAT 状態
プロセスの 状態 (STATe)。 次のようなものがある。

R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。割り込み不可。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。
Z (Zombie)
既に終了していて、終了処理の完了を待ってる。
T (Traced)
一時的に停止しているか、デバッグの対象になっている。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
COMMAND
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。

◆プロセスと端末

プロセスは、端末に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセス も表示する。
$ ps x [←]
  PID   TT  STAT      TIME COMMAND
  526   ??  Ss     0:00.06 /sbin/launchd
  547   ??  S      0:00.26 /System/Library/CoreServices/Dock.app/Contents/MacOS
  548   ??  S      0:00.31 /System/Library/CoreServices/SystemUIServer.app/Cont
  549   ??  S      0:00.62 /System/Library/CoreServices/Finder.app/Contents/Mac
  553   ??  S      0:01.33 /System/Library/Frameworks/ApplicationServices.frame
  556   ??  S      0:00.00 /usr/sbin/pboard
  560   ??  S      0:00.01 /System/Library/Frameworks/InputMethodKit.framework/
  561   ??  S      0:00.35 /System/Library/Input Methods/Kotoeri.app/Contents/M
  564   ??  S      0:00.17 /usr/libexec/UserEventAgent -l Aqua
  578   ??  S      0:00.04 /System/Library/CoreServices/Menu Extras/TextInput.m
  580   ??  S      0:00.01 /System/Library/CoreServices/CCacheServer.app/Conten
  604   ??  S      0:00.09 /System/Library/Frameworks/OpenGL.framework/Versions
  606   ??  S      0:09.23 /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_
  616   ??  S      0:02.03 /Applications/Firefox.app/Contents/MacOS/firefox-bin
  638 s000  Ss     0:00.01 login -fp yas
  639 s000  S      0:00.01 -bash
  652 s000  S+     0:00.21 emacs
  645 s001  Ss     0:00.01 login -fp yas
  646 s001  S      0:00.01 -bash
  659 s001  R+     0:00.00 ps x
$ []

◆プロセスとユーザ

プロセスには、どのユーザの資格で実行しているかという情報( UID, User Identifier )が設定されている。この資格は、通常はそのプロセスを起動した ユーザになる。psコマンドを引数なしに実行すると、自分の資格で実行してい る(端末がある)プロセスだけを表示する。他人のプロセスも表示したい時は、 psコマンドを実行するときに「a」オプションをつける。
$ ps a [←]

◆プロセスと資源

psコマンドにuオプションを付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas    652   0.0  0.3  2451208  13168 s000  S+    5:58PM   0:00.21 emacs
yas    646   0.0  0.0  2435468   1008 s001  S     5:58PM   0:00.01 -bash
yas    639   0.0  0.0  2435468   1008 s000  S     5:58PM   0:00.01 -bash
$ []
%CPU
過去1分間に利用した CPU 時間の割合。
%MEM
実際に消費してるメイン・メモリの大きさの割合。
VSZ (Virtual Size)
仮想記憶上のプロセスの大きさ。KB 単位。
RSS (resident set size)
実際に消費してるメイン・メモリの大きさ。
STARTED
プロセスが生成された時刻。

◆プロセスの親子関係

プロセスがある命令(システム・コール)を実行すると新しくプロセスが 生成される。 プロセスにはそのプロセスの生みの親が1個ある。 もとのプロセスを「親プロセス」とう。

親子関係により、プロセスは全体として木構造を作る。

親プロセスのプロセス識別子は、psコマンドに「l」オプションをつけると PPIDのところに表示される。

$ ps l [←]
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
 1013   639   638   0  31  0  2435468   1008 -      S    s000    0:00.01 -bash
 1013   652   639   0  31  0  2451208  13168 -      S+   s000    0:00.21 emacs
 1013   646   645   0  31  0  2435468   1008 -      S    s001    0:00.02 -bash
$ []
PID 652 の emacs の親プロセスは、PID 639 の bash。

■プロセスを殺す(kill)

手引き 2.3.2 参照The Unix Super Text 10.5節 参照

プロセスを殺すとは、プロセスが自主的に終了しない時に、強制的に終了させ ること。

Unix では、プロセスを殺す方法は、主に次の2つ。

どちらの方法でも、裏では シグナル (ソフトウェア割込み) という仕掛けが働く。

◆キーによるプロセスの強制終了

端末で動作しているプロセスが、キーボードからキーを読み込んでいる状態の 時には、^C (Control + C) を押すと、終了できる。以下は、 cat コマンドのプロセスを^Cで強制終了している。
$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^C
$ []
^C と同様に ^\ (「^\」または「^¥」) もプロセスを強制終了させるキーで ある。^\ は、^Cが利かないときでも利くことがある。

^\ の場合、デバッグ用にcore という名前のファイル ができる。普段は、core ファイルは不要なので、^C を使うべ きである。

coins の環境では、core ファイルが作られないように設定されている。 core ファイルの利用方法は、デバッガ gdb のマニュアル、 man core (core ファイルの man ページ(man コマンドで表示されるページ))、 Unix Super Text 下巻 「第60章 デバッグの方法」を参照。

stty コマンドを使うと、^C^\ を変更でき る。

$ stty -a [←]
speed 38400 baud; 35 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
        -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ; dsusp = ^Y; eof = ^D; eol = ;
        eol2 = ; erase = ^?; intr = ^C; kill = ^U;
        lnext = ; min = 1; quit = ^\; reprint = ^R; start = ^Q;
        status = ; stop = ^S; susp = ^Z; time = 0; werase = ^W;
$ []
「intr」のところに表示されるものが「^C」, 「quit」のところに表示されるものが「^\」に相当するキー。 「kill」は、1行削除の意味。

◆kill コマンドによるプロセスの強制終了

^C^\ で死なないプロセス (lv, emacs など) を殺すには、kill コマンドを使う。
$ kill pid [←]
これは、プロセス識別子pidのプロセスを殺す。 他人のプロセスは、権限がないので殺せない。

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]

■プロセス関連のコマンドのまとめ

ps			プロセスの一覧の表示
ps ux			プロセスの一覧の表示(BSD,Linux)
ps aux			プロセスの一覧の表示(BSD,Linux)
stty all		端末の状態の表示(BSD)
stty -a			端末の状態の表示(System V,Linux)
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。 ;

■電子メール

who@coins.tsukuba.ac.jp に届いた電子メールは、毎日、読むこと。特に、コ ンピュータ・リテラシの授業の最中は必ず読むこと。

TAや教官からメールが来て、必要な返事は、次の実習時間/講義時間までに 出すこと。

coins 以外のメール・サーバを主に使うときには、~/.forward による転送の設 定を行うこと。

■~/.forwardによる電子メールの転送

The Unix Super Text 25.9.1 参照メール・リーダの操作には、 受け取ったメールを他のユーザへ 転送(forward) する操作がある。 それとは別に、届いたメールをユーザの操作を介さずに自動的に他のアドレス (普通は他のホストにある別の自分の電子メール・アドレス)に転送する機能 がある。この機能を使うには、ホーム・ディレクトリの下の ~/.forward というファイルに、転送先のアドレスを書く。 たとえば、 shiro@himalaya.is.tsukuba.ac.jp に届いたメールを全て shiro@alps.is.tsukuba.ac.jp に転送したいとする。この時、 himalaya の方のホーム・ディレクトリの下の ~/.forward に次のように書く。
shiro@alps.is.tsukuba.ac.jp
単純に転送先のアドレスを書く方法では、~/.forwardが あるホストには、何も残らないが、コピーを残しながら、転送する方法もある。 それには、次のように自分のログイン名に\を付けたア ドレスを含める。
\shiro, shiro@alps.is.tsukuba.ac.jp
注意:「\」は、ASCII 「5c(16進数)」である。 「\」と表示されたり「¥」と表示されることがある。 「/」ではない。

この例では、himalaya に届いた電子メールは、himalaya と いうホストの \shiroというユーザの 配送プログラム用メール・ボックスに入り、 さらに、shiro@alps.is.tsukuba.ac.jp にも送られる。

~/.forwardにおけるループの危険性

複数のメール・アドレスがある人は、どのホストにログインした時にも、全部 のホストに届いた電子メールが読める状態にしたいと思うかもしれない。 上の例では、 alps にログインした時にも、 alpshimalaya の両方のメールが読め、 また、himalaya にログインしてもやはり alpshimalaya の両方のメールが読める と便利に思えるかもしれない。しかし、こうすることは技術的に難しいので、 しばらくはあきらめて欲しい。

\loginnameの機能をつかっても、なかなかうまくいかない。 たとえば、次のよう な ~/.forward を作成したと考える。(実際に実行すると危険なので、 考えるだけする。)

(alps:~/.forward)
\shiro, shiro@himalaya.is.tsukuba.ac.jp
(himalaya:~/.forward)
\shiro, shiro@alps.is.tsukuba.ac.jp
この状態で、shiro@alps.is.tsukuba.ac.jp にメールが届いた 場合、次のようなことが起る。
  1. alps にコピーが残され、かつ、 shiro@himalaya.is.tsukuba.ac.jp に送らる。
  2. himalaya では、やはり、コピーが残され(ここまでは順調)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる(!)。
  3. alps では、コピーが残され(2回目)、himalaya に送られる。
  4. himalaya では、コピーが残され(2回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  5. alps では、コピーが残され(3回目)、himalaya に送られる。
  6. himalaya では、コピーが残され(3回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  7. alps では、コピーが残され(4回目)、himalaya に送られる。
  8. himalaya では、コピーが残され(4回目)、 さらに、shiro@alps.is.tsukuba.ac.jp に送られる。
  9. ...
このような電子メールのピンポンが、永遠に続く。実際には、電子メールの転 送には上限が設定されているので、その上限に達した段階でエラーになって止 る。

3ヵ所以上でこの設定をしたとすると、中継される度にメールが増殖する。

\loginname の機能を使っていなかったとすると、コピーは 残らないが、メールが行き来するだけで、どこにも届けられずにエラーになる。

~/.forward の設定をしたら、必ず自分で自分あてに電子メールを出 して届くかテストすること。~/.forward の設定を間違えると、エラー のメールも届かなくなるので、エラーが起こっていることさえわからなくなる。

~/.forward の機能は、もともとは、sendmail という種類のMTA の機 能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。

◆電子メールをプログラムに転送する

The Unix Super Text 25.9.2 参照~/.forward の応用として、他のアドレスに電子メールを転送するの ではなく、(サーバ上で実行される)プログラムに転送する機能がある。すな わち、(サーバ上で)プログラムを実行して標準入力に電子メールの内容を与 えるという機能がある。これには、次のように~/.forwardに書く。
"| /program/path/name arg1 arg2 arg3 ... argn" 
このように、| に続いて、プログラムのパス名と引数を書き、 全体を "" で括る。

この機能を使って、受け取った電子メールを自動的に分類したり、 spamメール を排除したりすることができる。たとえば、MH の slocalやprocmail と呼ば れているプログラムがこの機能を使っている。

■Emacs

◆set-buffer-file-coding-system

Emacs は、日本語を含めて様々な言語を扱うことができる。 日本語を扱う時には、次のような文字コードを使うことができる。 auto-save のファイルで、ファイル名が 「#ファイル名#」 のようになっているものは、emacs-mule-unix になっている。この 文字コードのままレポートとして投稿するなど、Emacs 以外のプログラムに渡 してはならない。他のプログラムに渡す時には、EUC-JP など、他のプログラム でも解釈できる標準のコードにしなさい。

ファイルに保存する時の文字コードを変更するには、次の機能を使う。

M-x set-buffer-file-coding-system [←]
その後、次の機能(write-file)でファイル名を変更しながら保存するとよい。
C-x C-w

◆universal-coding-system-argument

Emacs は既存のテキストファイルを開く時に文字コードの自動判定を行う。こ の判定は、強力ではあるが、時々判定に失敗する。その時には、文字コードを 指定しながファイルを開く方法がある。
M-x universal-coding-system-argument [←]
以後、文字コードを指定し、C-x C-f の操作を行う。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

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

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

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

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

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

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

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

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

★練習問題(704) 環境変数 HOME

環境変数 HOME の値を調べなさい。
$ echo $HOME [←]
cd コマンドの引数に与えて、ホーム・ディレクトリや ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd / [←]
$ cd $HOME [←]
$ cd / [←]
$ cd $HOME/Desktop [←]
$ []
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比 較しなさい。

★練習問題(705) シェル変数 HISTFILESIZE

シェル変数 HISTFILESIZE の値を調べなさい。
$ echo $HISTFILESIZE [←]
history コマンドで表示されるコマンドの数を調べなさい。
$ history [←]
<表示>
$ history | wc [←]
$ []
シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。

★練習問題(706) シェル変数 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) の 「/」 による検索が便利である。

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

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

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

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ 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
$ []

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

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

★練習問題(710) psコマンド

手引き 2.3.1 参照The Unix Super Text 第10章 参照

ps コマンドを使って、プロセスの一覧を表示しなさい。

$ ps [←]

★練習問題(711) psコマンドのオプション

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps -l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
BSD 系の ps (MacOSX, Linux含む) では、オプションの「-」を省略できる。た とえば、次の2つは、同じ意味である。このことを確かめなさい。
$ ps l [←]
$ ps -l [←]

他のオプションについて、man ps を見て見なさい。

★練習問題(712) psコマンドとlvコマンド

ps コマンドに a オプションを付ける等して、プロセス数が多くなると画面に 入り切らなくなる。この時には、lv コマンドと組み合わせるとよい。
$ ps aux | lv [←]
この方法を、確かめなさい。lv コマンドについては、 手引き 2.2.14 参照lv コマンド を参照しなさい。q(終了)、次のページへの移動(スペースキー)、 ページを戻る(b)は、必ず覚えなさい。

★練習問題(713) psコマンドで横長の表示

ps ux や ps aux では、MacOSX 関連のプロセスの表示が切れてしまう。 w コマンドを使ってより多くの情報を表示さててみなさい。
$ ps aux [←]
$ ps auxw [←]
あるいは、iTerm の画面を横幅を広げて ps コマンドを打ちなさい。 横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。

★練習問題(714) topコマンド

top コマンドで、「重たい」プロセスを表示しなさい。 「重たい」プロセスとは、CPU時間を大量に消費しているプロセスや メモリを大量に消費しているプロセスのことである。 終了するには、小文字の q を打つ。^C でもよい。
$ top [←]
$ top -o cpu [←]
(CPU を消費している順)
MacOSX では、top コマンド自分自身が「重たい」と認識される。 その場合は、top コマンドが表示を変更する頻度を下げる。
$ top -s 4 -o cpu [←]
man top でマニュアルを表示して、-o オプションと -U の使い方を 調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。 -U オプションで自分自身のプロセスだけを表示しなさい。
$ top -U $USER [←]

★練習問題(715) pstreeコマンド

pstreeコマンドを実行しなさい。それでプロセスの親子関係により木構造が作 られていることを確認しなさい。
$ pstree [←]
$ pstree | lv [←]
iTerm の画面の横幅を広げると見やすい。

★練習問題(716) 「アクティビティモニタ.app」の利用

「ユーティリティ(/Applications/Utilities/)」にある 「アクティビティモニタ.app(Activity Monitor.app)」 を動作させ、プロセスの一覧を表示させなさい。
$ open "/Applications/Utilities/Activity Monitor.app" [←]
または、Finder で、「移動」メニューから「ユーティリティ」を 選択。「アクティビティモニタ.app」のアイコンをダブルクリック。

アクティビティモニタの表示

アクティビティモニタの表示

表示されるプロセスの範囲を変えてみなさい。

top コマンドの表示と比較しなさい。

★練習問題(717) ^Cによる強制終了

^C (Control+C) によるプロセスの強制終了を行いなさい。
$ cat [←]
aaa[←]
aaa
bbb[←]
bbb
^C
$ []
なお、^C と 入力の終わりを意味する ^D は働きが異な る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、 ^C を使いなさい。

★練習問題(718) ^Cによる強制終了(2)

次のような終了するのに時間がかかるプログラムを実行してしまって、途中で やめたくなった時に ^C で終了するように練習しなさい。
$ ls -R ~/Library [←]
(大量の表示、省略)
^C
$ []

★練習問題(719) ^Cが効かないプログラム

端末 (iTerm) の中で実行されるプログラムのうち、次のようなプログラムは、 ^C でも終了しない。このことを確認しなさい。 注意: C-c は、C-x と同じように、2ストローク以上で1つの意 味をなすことが多い。何もない状態でC-c を打った場合には、 C-g によりキャンセルしなさい。

★練習問題(720) killコマンド

手引き 2.3.2 参照The Unix Super Text 10.5節 参照

kill コマンドを使って、プロセスを殺してみなさい。

  1. iTerm 等で、端末を2個つ表示し、それぞれシェルを実行する。
  2. 片方の端末で、lv コマンドでファイルを表示する。
  3. もう片方の端末で、ps コマンドで lv コマンドから実行された プロセスの PID を調べる。
  4. kill コマンドで lv コマンドから実行されたプロセスを殺す。

lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。

★練習問題(721) killコマンドで他人のプロセスを殺そうとしてみる

ps コマンドで調べたプロセスのうち、他人のプロセス(root、その他) を kill コマンドで殺そうとしてみなさい。何がおきるかを観察しなさい。どのよ うなエラーが生じるか。

★練習問題(722) ps コマンドと grep コマンド

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。次の例は、cat コマンドか らなるプロセスを探している。
$ ps ux | grep cat [←]
$ ps uxw | grep cat [←]
この機能を利用して見なさい。 次のようにして、Finder や Dock のプロセスの PID を調べなさい。
$ ps uxw | grep Finder [←]
$ ps uxw | grep -i finder [←]
$ ps uxw | grep Dock [←]
$ ps uxw | grep -i dock [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。

★練習問題(723) ps | grep、kill

次の一連の操作を行いなさい。
$ ps uxw | grep cat [←]
$ kill  [←]

★練習問題(724) MacOSX Command+Option+Esc

MacOSX で、Command+Option+Esc キーを押すと 「アプリケーションの強制終了」のウインドウを表示できる。

(まず、Commandキー(Command) と Option キーを左手で押し、 押しっぱなしの状態で、右手で Esc キーを一度押して離す。)

Command+Option+Escキー

「アプリケーションの強制終了」のウインドウ

この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。

★練習問題(725) .forwardの設定

coins 以外に日常的に読み書きするメール・アカウントがある 人は、毎日 coins に届いたメールを確認する方法として ~/.forward を設定(Emacsでテキスト・ファイルを作成) して、転送する方法が考えられる。 そのようにしたい人は、そうしなさい。 設定が完了したら、必ずテストして、うまく動いていることを 確認しなさい。 メールがループしないことを確かめなさい。

★練習問題(726) ^Zキーからの復帰

端末の中で、キー Key(^Z) (Control + Z) は、プロセスを 一時的に止めるためのキーである。 詳しくは、The Unix Super Text 第22章 参照。 この機能は使わなくても良いが、不意に Key(^Z) を押した時に元の状態に戻す ことは必要である。次の方法で、元に戻ることを確認しなさい。 注意:Emacs を終了するために、^Z (C-z) を使ってはなら ない。

★練習問題(727) Firefoxのプロファイルの切替え

Firefox には、様々な設定(たとえばブックマークや最初に表示されるページ) を「プロファイル」と呼んでいる。この設定を複数作成して切り替えながら利 用できる。この機能を利用してみなさい。

coins では、コマンドラインから次のように打つと、 ProfileManager という機能が働く。

$ firefox-profilemanager  [←]
この画面で、プロファイルの作成、削除、指定しなかった時に使われるプロファ イルを指定することができる。(プロファイルが複数ある場合、1個目の Firefox のプロセスを実行する時にoption キーを押しながら実行すると、この 機能が働く。)

複数のプロファイルを用いればね複数の Firefox のプロセスを同時に実行する ことができる。Firefox は、もともと1つのプロセスで複数のウインドウを開 くこともできる。この2つの機能の違いと有効な利用方法を考えなさい。

★練習問題(728) Emacs M-x set-buffer-file-coding-system

EmacsのM-x set-buffer-file-coding-system を使って、ファイルの文字コードを変更することができる。 このことを確認しなさい。

★練習問題(729) Emacs universal-coding-system-argument

Emacs は既存のテキストファイルを開く時に文字コードの自動判定を行う。こ の判定は、強力ではあるが、時々判定に失敗する。その時には、文字コードを 指定しながファイルを開くとよい。この機能を使ってみなさい。

Emacs で文字コードを指定しながらファイルを開くには、次のようにする。

  • 次のように打つ。
    M-x universal-coding-system-argument [←]
    M-x は、Esc x でもよい。
  • すると、ミニバッファに次のような表示がなされる。
    Coding system for following command (default, xxx): 
  • このプロンプトに対して文字コードを指定する。 以下の例では、euc-jp-unix を指定している。
    Coding system for following command (default, xxx): euc-jp-unix[←]
  • 続いて C-x C-f (find-file) を実行する。

    ★練習問題(730) Emacs fill-paragraph (Esc q, M-q)

    Emacs には、1行の長さをそろえる機能がある。たとえば、次のように乱れたものを
    M-q runs the command fill-paragraph 
    which is an interactive compiled
    Lisp
    function
    in `textmodes/fill'.
    It is bound to M-q.
    
    M-q または Esc q で、標準で 70 以内になるように次のように整える。
    M-q runs the command fill-paragraph which is an interactive compiled
    Lisp function in `textmodes/fill'.  It is bound to M-q.
    
    整える範囲は、上下に空行で区切られた範囲である。長過ぎる行は、改行が入 れられる。英単語の場合には、途中で改行することはない。日本語の場合には、 標準では、35文字で改行される。

    この機能を確認しなさい。

    ★練習問題(731) Emacs set-fill-column

    fill-paragraph で、折り返す文字数を変えたい場合には、set-fill-column を 使う。
    C-u  C-x f
    
    あるいは、折り返したい位置にカーソルを移動してから次のように打つ。
    C-x f
    
    以後、M-q または Esc q で折り返しを行った時には、指定 した文字数で折り返される。この機能を確認しなさい。

    ★練習問題(732) ps -lによる親子関係

    ps -l や pstree コマンドを使えば、プロセスの親子関係を調べることができ る。親子関係は、全体としては、木構造になっている。そのことを調べなさい。

    全てのプロセスの親プロセスは、PID 1 プロセスになっている(根に相当)。

    ★練習問題(733) lsofコマンド

    lsof コマンド(list open files) は、プロセスの一覧と同時に、プロセスがど のファイルを開いているかを表示するコマンドである。これを実行してみなさ い。

    ■課題7 シェル(2)、プロセス、電子メールの転送、Emacs

    以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。端末の表示 (コマンドの実行結果)は、コピー&ペースト等の機能を使って提出するファイ ルに含めなさい。課題が達成されたことを示す程度には見やすいように編集し なさい。ただし、過度の編集は避けなさい。編集した部分は必要に応じて省略 記号を入れなさい。

    テキスト・ファイルで、右揃えをするには、パラグラフの区切りを、空行にし た上で、M-q (Esc q, M-x fill-paragraph) の機 能を利用するとよい。

    (1) 次のファイル名(ディレクトリ名も含めたすべて)を、適当なシェル変数を 設定して短く表現しなさい。

        /Applications/Firefox.app
        /Applications/Thunderbird.app
        /Applications/QuickTime Player.app
    
    短く表現したものを、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: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。

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

    たとえば、次のように回答しなさい。
    $ echo 回答内容 [←]
    Lib*
    $ []
    
    注意:これは、メタキャラクタをエスケープする課題である。単に echo コマ ンドに対してこのような文字列を与えればよいということでない。

    (3) 端末を2つ開きなさい。片方で強制終了させてもよいプロセスを作成しな さい。プロセスの作成方法としては、たとえば、lv コマンドでテキスト・ファ イルを表示する方法が考えられる。もう一方の端末で、そのコンピュータで動 作している自分自身のプロセスだけを ps コマンドで表示しなさい。端末と結 びついていないプロセスも含めなさい。

    (4) kill コマンドを使って、(3) で作成したプロセスを殺しなさい。ps コマ ンドの結果を示し、それがきちんと死んだことを示しなさい。

    (5) 電子メールの転送について、当てはまる行の先頭に yes, 当てはまらない 行の先頭に no と記述しなさい。

    (a) coins 以外に電子メールのアカウントがある。
    (b) coins のメールを毎日読む。
    (c) ~/.forward の機能を理解した。
    (d) ~/.forward を設定した。
    

    (6) coinsに届いたメールを毎日確認する方法を書きなさい。

    (7) ls -l (ls -ld) を使って、次のファイルのモードを調べなさい。そして、 どのようなユーザやグループがどのようにアクセスできるかを説明しなさい。

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

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

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

    そして、項目についてついて調べて、簡単に説明しなさい。 (10) [加点] The Unix Super Text の次の部分を読みなさい。 そして、フリーソフトウェアの発展におけるGPL の果たした役割について、 5-10行でまとめなさい(1行は、ASCII で60文字-80文字、漢字で35文字-40文字)。 GPL に基づき配布されているフリーソフトウェアの中で、コンピュータリテラ シで取り上げるのにふさわしいものを 2 つ選んで、名前と機能を紹介(5-10行)し なさい。ただし、Emacs 等、この講義で取り上げたものを紹介してはならない。

    (11) [加点] The Unix Super Text の次の部分を読みなさい。 そして、以下の項目について何らかのコマンドを実行して、動作を確認しなさ い。レポートには、端末でのコマンドの実行結果を付け、そのコマンドが有効 に動作していることを示しなさい。


    Last updated: 2011/06/15 14:39:37
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>