システムプログラム(第0回): 端末(2)

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

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

今日の重要な話

その他

■プロセス

説明するのは、けっこう難しい。完全な理解には、次のような勉強が必要にな る。 その前に、ps コマンド、kill コマンドを使えるようにする。

◆プロセスとは

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

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

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

メモリにプロセスが3つ、オペレーティング・システム・カーネル、ハードディスク、プロセッサ
プログラムとプロセス

プロセスの操作

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

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

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

■プロセスの観察

手引き 2.10.1 参照

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

$ ps [←]
  PID TTY           TIME CMD
  912 ttys000    0:00.03 -bash
  947 ttys001    0:00.02 -bash
  988 ttys001    0:00.04 ssh www.coins.tsukuba.ac.jp
 1027 ttys002    0:00.01 -bash
 1070 ttys002    0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 最大5桁の番号。
TTY, (TT) 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/ttys000ttys000になる。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
CMD (または COMMAND)
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。
ps コマンドで表示される端末の名前は、 端末プログラムのウィンドウごとや、ssh での遠隔ログインごとに違う。 シェルで、自分の端末の名前は、tty コマンドで調べることができる。
$ tty [←]
/dev/ttys000
$ []

◆プロセスと端末

Unix 系の OS (Linux, macOS 含む)でプロセスは、「端末」に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセス も表示する。
$ ps x [←]
  PID   TT  STAT      TIME COMMAND
  772   ??  Ss     0:00.14 /sbin/launchd
  794   ??  S      0:00.28 /usr/libexec/UserEventAgent (Aqua)
  795   ??  S      0:01.41 /usr/sbin/distnoted agent
  799   ??  S      0:00.30 /usr/sbin/cfprefsd agent
  803   ??  Ss     0:04.57 /usr/libexec/xpcd
  807   ??  S      0:00.04 /usr/sbin/pboard
  809   ??  S      0:00.13 /System/Library/PrivateFrameworks/CalendarAgent.fram
(中略)
 1014   ??  S      0:00.04 /System/Library/CoreServices/ScopedBookmarkAgent
 1064   ??  S      0:00.09 /System/Library/Frameworks/QuickLook.framework/Resou
 1065   ??  Ss     0:00.09 com.apple.quicklook.satellite
  911 s000  Ss     0:00.02 login -fp yas
  912 s000  S      0:00.03 -bash
 1122 s000  R+     0:00.00 ps x
  945 s001  Ss     0:00.01 login -fp yas
  947 s001  S      0:00.02 -bash
  988 s001  S+     0:00.07 ssh www.coins.tsukuba.ac.jp
 1024 s002  Ss     0:00.01 login -fp yas
 1027 s002  S      0:00.01 -bash
 1070 s002  S+     0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emac
$ []
ps に x, l, u, a 等のオプションを付けると、 ps はプロセスの 状態 (STATe) を表示する。よく表示される状態には、次のようなものがある。
R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。

◆プロセスとユーザ

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

◆プロセスと資源

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。 練習問題 ps u 参照。

◆プロセスの親子関係

プロセスには、生みの親となるプロセスが1個ある。 もとのプロセスを「親プロセス」、 親プロセスから生まれたプロセスを 「子プロセス」とう。 psコマンドにlオプション(long)を付けると、 親プロセスを表示することができる。 親子関係により、プロセスは全体として木構造 木構造(tree structure) を作る。

練習問題 ps lと親プロセスpstreeコマンド参照。 。

■プロセスを殺す(kill)

手引き 2.10.2 参照

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

◆どんな時にプロセスを強制終了したいか

◆プロセスを殺す2つの方法

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

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

注意: 端末プログラムでウィンドウを閉じたくらいでは、 問題のあるプロセスは死んでいないこともある。

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

端末で動作しているプロセスが、キーボードからキーを読み込んでいる状態の 時には、^C (Control + C) を押すと、終了できる。
$ sleep 5; echo ^G [←]
(# ^G は、^V^G と打つ。^V は、端末に制御コードを打つ時に使う。)
(5秒待った後、ベルが鳴る。簡易目覚まし時計。「;」は、1行に複数のコマンドを書く時の区切り。)
$
以下の例では、500秒 sleep した後に目覚ましを慣らしたかったが、途中でや めたくなった。
$ sleep 500; echo ^G [←]
^C
$ []
^C を押すと、端末の働きで、プロセスに対して 「シグナル」が飛ぶようになっている。

cat コマンドは、引数のファイルを画面に表示する。

$ cat ~/.bashrc [←]
#
# coins standard ~/.bashrc [←]
#
if [ -f /usr/local/lib/standard/bashrc ]; then
        . /usr/local/lib/standard/bashrc
fi

# add your own code below [←]
$ []
cat コマンドは、引数を与えないと、キーボードから(行単位で)データを読み、 それを画面に表示する。 途中で 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 コマンドで表示されるページ))、

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

$ stty -a [←]
speed 38400 baud; 40 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 = ^O; dsusp = ^Y; eof = ^D; eol = ;
	eol2 = ; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
	min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
	stop = ^S; susp = ^Z; time = 0; werase = ^W;
$ []
「intr」のところに表示されるものが「^C」, 「quit」のところに表示されるものが「^\」に相当するキー。 「kill」は、1行削除の意味。

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

^C^\ で死なないプロセス を殺すには、kill コマンドを使う。

これには、普通、別の端末を使う。 ssh で遠隔ログインしている時は、端末プログラムで、もう1枚ウィンドウを開き、 同じホストに遠隔ログインする。 ps コマンドで PID を調べ、kill コマンドに与える。

$ ps  [←]
(pidを調べる)
$ kill pid [←]
$ []
kill コマンドでは、引数で与えれたプロセス識別子pidのプロセスを殺す。 他人のプロセスは、権限がないので殺せない。

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。たとえば、PID が 1023 のプロセスを殺す 時には、次のように打つ。

$ kill 1023 [←]

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]
-KILL 以外にも、様々な種類がある。詳しくは、man kill を参照。

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

ps			プロセスの一覧の表示
ps x			プロセスの一覧の表示
ps ax			プロセスの一覧の表示
stty -a			端末の状態(キーの割り当て)の表示
^C (キーボード)		プロセスを殺す
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。PIDと打つのではない。

■シェルと標準入出力

シェル(shell) は、次のようなプログラムである。 コマンド・インタプリタともいう。

◆プログラムの入出力

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

◆標準入出力

Unix では、端末でシェルから実行されるプログラムは次の3種類の入力と出力をあてにしている。
標準入力 (stdin, standard input, 0番)
普通、キーボードにつながっている。
標準出力 (stdout, standard output, 1番)
普通、画面につながっている。
標準エラー出力 (stderr, standard error output, 2番)
普通、画面につながっている。

キーボード、標準入力、プログラム、標準出力、標準エラー出力、画面
図? プログラムの標準入出力の普通の接続先

$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^D
$ []
cat コマンドは、入力しているファイルが終わりになる(EOF, end of file)と、自動的に終了する。 キーボードからの入力は、無限に継続可能だが、^D (Control + D) と打つと、 普通のファイルと同様に、ファイルの終わりという意味になる。

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

シェルは、「記号>」 があると、標準出力を画面から指定されたファ イルに切り替えて、指定されたプログラムを実行する。
$ ls -l > file1 [←]

キーボード、標準入力、プログラム、標準出力、ファイル、標準エラー出力、画面
図? プログラムの標準出力のファイルへの切替え

シェルは、「記号<」 があると、標準入力をキーボードから指定され たファイルに切り替え、指定されたプログラムを実行する。
$ head -4 < file1 [←]
headコマンド は、ファイルや標準入力の先頭を表示する ためのコマンド。-n (nは数)というオプションが与 えられると、先頭の n 行だけ表示する。

ファイル、標準入力、プログラム、標準出力、標準エラー出力、画面
図? プログラムの標準入力のファイルへの切替え

シェルは、「記号|」があると、次の動作を行う (パイプ(pipe)機能)。 例:
$ ls -l | head -4 [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ []

ファイル、標準入力、プログラム、標準出力、パイプ、標準エラー出力、画面、パイプ、標準入力、次のプロセス
図? プログラムの標準出力のパイプへの切替え

ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ ばならない。
$ ls -l | head -4 [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ ls -l > file [←]
$ head -4 < file [←]
total 99
drwx------   4 yas  prof   3072  4 10 17:37 Desktop
drwx------   3 yas  prof   1024  3 11 13:52 Documents
drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ rm file [←]
$ []
パイプは、3つ以上のプログラム(プロセス)を結びつけることもできる。
$ ls -l | cat -n | head -4 [←]
     1	 total 99
     2	 drwx------   4 yas  prof   3072  4 10 17:37 Desktop
     3	 drwx------   3 yas  prof   1024  3 11 13:52 Documents
     4	 drwx------   2 yas  prof     80  3 10 18:16 Downloads
$ []
cat コマンドは、「-n」オプションを付けると行番号を付加する。

◆標準エラーの役割

標準出力の切り替えを行ったとしても、標準エラーは画面に表示される。
$ 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
ファイルが存在しても、消さずにその後ろに追加する。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi > hello.txt [←]
$ cat hello.txt [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi >> hello.txt [←]
$ cat hello.txt [←]
hello
hi
$ []

■ファイルの属性

ls コマンドに -l (long) オプションをつけると、 ファイルやディレクトリだけでなく、いくつかの属性も合わせて表示される。
$ ls [←]
Desktop         Downloads       Maildir         file1           file3
Documents       Library         Pictures        file2
$ ls -l [←]
total 9
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Desktop
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Documents
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Downloads
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Library
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Maildir
drwxr-xr-x  2 yas  prof  80  4 14 20:21 Pictures
-rw-r--r--  1 yas  prof  15  4 14 20:22 file1
-rw-r--r--  1 yas  prof  27  4 14 20:23 file2
-rw-r--r--  1 yas  prof  27  4 14 20:26 file3
$ []

ファイルの型

ls -l の一番左1文字は、ファイルの型(type)を表わす。
-
ファイル
d
ディレクトリ

ファイルの型とファイルへのアクセス(読み書き)の可否を決めるための属性

許可されたアクセス方法(モード)

ls -l で、ファイルの型の次の 9 文字は、許可されたアクセス方法を示す文字。 モード(mode)とも言う。 9文字は、3文字の固まりが3組ある。

ファイルのモードの例、所有者、グループ、その他、110,100,100、rw-r--r--
ファイルのモードの例

各3文字はアクセス毎にその許可・拒否を表す。

r	読込み可
w	書込み可
x	実行可(ディレクトリの場合は探索可)
モードで該当する部分が「-」の場合は、その種類のアクセスが許可さ れてないことを意味する。

「読込み可」とは、その内容を参照できること意味する。たとえば、cp コマン ドでコピーできる。読出し可能なディレクトリなら、ls コマンドでそのディレ クトリ中のファイル名の一覧を表示できる。

「書込み可」とは、その内容を変更することができることを意味する。たとえ ば、テキスト・ファイルなら、エディタで修正したものを書き込むことができ る。書込み可能なディレクトリなら、mv コマンドでそのディレクトリのなかに あるファイル名前を変更できる。

「実行可」というのは、ファイルの内容がプログラムの場合は、 そのプログラムを実行することができる。

ディレクトリに対する 「検索可」というのは、その下にあるファイルやディレクトリを たどっていける(ファイルを開く(読み書きのため)、cd (change directory)できる)という意味である。

ディレクトリが「読込み可」でも、「検索可」でないと、 ディレクトリに「読込み可」のファイルがあっても、 ディレクトリに入ってファイルを読むことができない。 逆に、「検索可」でも、ディレクトリが「読込み可」でないと、 ディレクトリにあるファイル名やディレクトリ名を表示させることが できない。

そのディレクトリにあるファイル名を知っていて、そのファイルが「読み込み 可」なら読むことがでる。

アクセスするユーザによって異なったアクセスの許可・拒否がしたいことがあ る。そのために、rwxの指定は、ファイルの所有者、ファイルの属すグループ、 それ以外の人用に3セット用意されている。

例:モードが「rw-r--r--」のファイル

まとめると、「誰でも読めるが所有者しか書けない」。

■アクセス制御

アクセス制御(access control) とは、「主体」が、「オブジェクト」を「操作」する時、どんな操作なら正し いということを定義して、それがきちんと守られていることをということを保 証することである。

図? アクセス制御における主体、オブジェクト、および、操作
図? アクセス制御における主体、オブジェクト、および、操作

Unixでは、アクセス制御の主体は、 プロセス である。 プロセスとは、コンピュータの中で実行中のプログラムのことである。 (プログラムでも、ハードディスクに保存されているものはプロセスではない。) プロセスは、利用者と対応しているので、 アクセス制御では、利用者ごとに許されたアクセスの方法を考えれば良い。

アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。

◆ユーザとグループ

Unix (macOS, Linux含む), Windows では、ユーザ(個人)とグルー プを識別したアクセス制御を行うことができる。 オペレーティング・システムごとに、ユーザやそのグループの考え方は、基本 的には似ているが、細かい所で異なる。

図? 実世界のユーザとUNIX中のプロセス・ファイル
図? 実世界のユーザとUNIX中のプロセス・ファイル

◆ユーザ

ユーザ(user, 利用者)とは、Unixの外では、個人(人間)。 Unixの内部では、次のどれかで表現する。
ユーザ名(user name)
文字列
UID(user ID, user identifier)
16ビット-32ビットの整数

Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。 ファイルとプロセスには、UID が付加されている。

◆グループ

グループ(group)とは、Unixの外の世界では、計算機を使う人間の集合。 Unixの内部では、次のどれかで表現する。
グループ名(group name)
文字列
GID(Group ID, group identifier)
16ビット-32ビットの整数

1人のユーザが複数のグループに属することができる。

◆ファイルの属性

ファイルは、属性(ls -l で表示)として、UID と GID を1つずつ持つ。 ファイルの所有者となる個人は、1人。 ファイルが属するグループも1つ。

◆プロセスの属性

プロセスは、UID (1個) と GID を複数個持つ。

◆プロセスのユーザ名とグループ名を調べる

プロセスの所有者のユーザ名を表示するには whoamiコマンドを用いる。
$ whoami [←]
yas
$ []
この例では、この人(のプロセス)のユーザ名は、yas

プロセスが属しているグループのグループ名を調べるには、 groupsコマンドを用いる。

$ groups [←]
ugrad _developer netaccounts everyone com.apple.sharepoint.group.1
$ []
この例では、この人(のプロセス)は、 ugrad, _developer, netaccounts everyone, com.apple.sharepoint.group.1, という5つ のグループに属している。

idコマンドも使える。

$ id [←]
uid=1013(yas) gid=530(ugrad) groups=530(ugrad),204(_developer),62(netaccounts),12(everyone),402(com.apple.sharepoint.group.1)
$ []

◆ファイルの UID・GID 属性を調べる

ファイルの UID 属性(所有者属性)と GID 属性を調べるには、 ls -l (ファイルの場合), ls -ld (ディレクトリの場合) を用いる。
$ ls -l ~/.bashrc [←]
-rw-r--r--  1 yas  prof  450  4  8 16:14 /home/prof/yas/.bashrc
$ ls -ld ~ [←]
drwxr-xr-x  54 yas  prof  7168  5 19 14:12 /home/prof/yas
$ []
この例では、UID 属性が yas、GID 属性が prof である。

◆ファイルに対するアクセス制御

Unixでは、ファイルの「内容」のアクセス制御を次の3段階で行う。
ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
グループ
ファイルのGIDが、プロセスのGIDのリストのどれかと同じ
その他
上の2つに当てはまらない時
これをつかって、モード属性の下位9ビットのうち、どの3ビットを使うかを 決める。そして、そのビットが1になっていれば、その操作が許される。

ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。

ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
それ以外
ファイルのUID(所有者)が、プロセスのUIDと異なる
ユーザの権限では、ファイルの属性(モード、グループ、時刻)を変更する ことができる。それ以外の権 限では、属性を読み出すことはできるが、変更は一切できない。 つまり、ファイルの内容がアクセスできなくても、ls -l で 属性を調べることはできる。

◆ディレクトリのxの働き

ディレクトリのモードで x は、そのディレクトリの内容を検索できることを意 味する。ディレクトリの x を落すことで、それ以下の部分木全体のアクセスを 禁止することができる。

(ホームディレクトリ以下の)ディレクトリの x を使ったファイルへの読み込み アクセスの許可と禁止。

図? /home/user2/public_html/htdocs/index.html と /home/user2/Maildir/mail1
図? ディレクトリのxの働き

ファイル /home/user2/public_html/htdocs/index.html を読むには、次のディレクト リとファイルのモードが必要になる。パスの途中で x が1つでも途絶えると、アクセ スできなくなる。
  1. / の x
  2. home の x
  3. user2 の x
  4. public_html の x
  5. htdocs の x
  6. index.html の r
ファイル /home/user2/Maildir/mail1 を読むには、次のディレクト リとファイルのモードが必要になる。パスの途中で x が1つでも途絶えると、アクセ スできなくなる。
  1. / の x
  2. home の x
  3. user2 の x
  4. Maildir の x
  5. mail1 の r

◆プロセスに対するアクセス制御

プロセスのアクセス制御は、次の2段階で行なう。
同一ユーザ
操作対象のプロセスが、操作するプロセスのUIDと一致している。
それ以外
操作対象のプロセスが、操作するプロセスのUIDと一致していない。
プロセスの操作としては、シグナルを送ることができるかどうか (kill() システムコール) と、デバッガで デバッグすることができるとか(ptrace() システムコール)、トレースを調べることができるかなどが ある。それらの操作は、同一ユーザの場合 許され、そうではない場合は、許されない。

◆スーパー・ユーザ

どのようなアクセスも可能な無敵のユーザ。

スーパー・ユーザ(super user) は、UID が 0 。 特権ユーザ(privileged user)ルート(root)su (su コマンド、あるいは super user の略)ともよばれる。 スーパーユーザのユーザ名は、慣例として root という文字列が使われる。

ファイルのバックアップなど、システム管理の作業には スーパー・ユーザの仕組みが必要になる。

ファイルの UID・GID 属性を変更する

ファイルの UID 属性(所有者属性)を変更するには、chown コマ ンドを用いる。ただし、スーパーユーザの権限が必要である。

ファイルをコピーして、元ファイルを消すことはできる。

ファイルの GID 属性を変更するには、chgrp コマンドを使う。 一般ユーザは、自分が属しているグループにのみ変更できる。 任意のグループに変更するには、スーパー・ユーザの権限が必要である。

◆ユーザ名とUID、グループ名とGIDの対応、属性の伝播

■ファイルのモードの変更

◆chmod コマンド

chmodコマンドは、ファイルのモード属性を変更するためのコマンド。
$ ls -l file1.txt  [←]
-rw-r--r--  1 yas  prof  2  5 10 18:59 file1.txt
$ chmod go-r file1.txt  [←]
$ ls -l file1.txt  [←]
-rw-------  1 yas  prof  2  5 10 18:59 file1.txt
$ []
file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み可」の許可を 取り除いている。

chmodは一般的には次の形式で実行する。

$ chmod set file1 file2 ... [←]
set の形式
[ugoa][=+-][rwx]
ここの[ugoa]は、誰に対するアクセスの設定を変更するかを対象となる人を以 下の表から選んで並べる(複数可)。
文字 単語 意味
u user ユーザ(利用者,所有者)
g group グループ
o others その他
a all 全員、ugo と同じ
[=+-]の意味
文字 意味
+ 許可を追加する
- 許可を除く
= 指定した許可だけとする
[rwxXst]の部分には次のような指定が可能。
文字 単語 意味
r read 読込み可
w write 書込み可
x execute 実行可
X execute 実行可(所有者に対して「実行可」がある時だけ)
setには[ugoa][=+-][rwx]の指定を「u=rw,og=r」のように「,」で区 切って複数並べることもできる。 setには、8進数を使うこともできる。 練習問題 8進数を利用したchmodコマンド 参照。

chmod には、-R (recursive)オプションがある。 これは、ディレクトリをたぐり全部変更することを意味する。

◆モードの実例

rw-r--r--
誰かでも読めるファイル
rwxr-xr-x
誰かでも読めるアクセスできるディレクトリ。 xもたてる。 (たてる==ビットを1にする。)
rwxr-xr-x
実行可能ファイル
rwx------
電子メール( Maildir, Mail )、 デスクトップ( Desktop )、 ダウンロード( Downloads )、 ライブラリ( Library )、 書類( Documents )等、 他人には見せないファイルを保存するための ディレクトリのモード。
rw-r--r--
WWWページ用のファイル (~/public_html以下のファイル)
rwxr-xr-x
WWWページ用のディレクトリ (public_html以下のディレクトリ)
rwxr-xr-x または rwx--x--x
WWWページを作成する時のホーム・ディレクトリ (~~/public_html の親ディレクトリ)。 x ビットを出す。
rw-rw-r-- または rwxrwxr-x
グループで共同作業するような時には、グループに属する人には書き込みを許す。
r-xr-xr-x, r-x------
読み込み専用のディレクトリ。 その下のファイルを削除することができない。

■シェル変数と環境変数

■変数とは

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

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

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

◆echo コマンドの復習

echo コマンドは、引数をそのまま画面(標準出力)に出力するコマンド。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo /usr/bin/*z [←]
/usr/bin/DeRez /usr/bin/Rez
$ echo /usr/bin/DeRez /usr/bin/Rez [←]
/usr/bin/DeRez /usr/bin/Rez
$ []

◆シェル変数の操作

シェル変数へ代入するには、「変数名=」を使う。
$ X=100 [←]
$ []
参照するには、「$変数名」とする。
$ X=100 [←]
$ echo $X [←]
100
$ []
他の変数と紛らわしい時には、 「"$変数名"」のようにダブルクォートで括るとよい。
$ echo x"$X"x [←]
x100x
$ []
(注意: $Xx と $X は別の変数なので区別できるようにする。) あるいは、${変数名}のように、 括弧で括る方法もある。
$ echo x${X}x [←]
x100x
$ []

シェル変数を削除するには、unset コマンドを使う。

$ unset X [←]
$ echo $X [←]

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

◆シェル変数を何に使うか

重複した入力を避けて、楽をするために使う。
$ coins=coins.tsukuba.ac.jp [←]
$ ssh www.$coins [←]
$ ssh aloe10.$coins [←]

◆環境変数の代入

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

◆環境変数の利用方法(TZ)

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

$ TZ=EST [←]
$ echo $TZ [←]
EST
$ export TZ [←]
$ date [←]
2022年  4月 12日 火曜日 20:50:40 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/prof/yas
$ echo '$HOME' [←]
$HOME
$ echo \$HOME [←]
$HOME
$ []

◆空白のエスケープ

ファイル名の一部に空白を含む場合、エスケープする必要がある。
$ ls -ld "/Applications/QuickTime Player.app" [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ open "/Applications/QuickTime Player.app" [←]
$ []
バックスラッシュを使ってもよい。
$ ls -ld /Applications/QuickTime\ Player.app [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ open /Applications/QuickTime\ Player.app [←]
$ []
bashのファイル名補完機能 では、空白を含むファイル名は、バックスラッシュで自動的に補完されることがある。
$ ls -ld /A[]
$ ls -ld /A[tab][]
$ ls -ld /Applications/[]
$ ls -ld /Applications/Q[]
$ ls -ld /Applications/Q[tab][]
$ ls -ld /Applications/QuickTime\ Player.app/[]
ファイル名の補完機能を使う時には、空白を打ち込むには、 「\ バックスラッシュ スペース」と打つ必要がある。

補完よりも、ファイル名の置き換え機能が簡単のこともある。
$ ls -ld /A*/Q* [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ []

◆環境変数PATH

環境変数PATHは、コマンドが存在するディレクトリを保持している環境変数である。
$ echo $PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/us
r/local3/bin:/usr/X11/bin:/Developer/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sb
in:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin:/opt/local/sbin:/opt
/local/bin:/usr/texbin
$ printenv PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/us
r/local3/bin:/usr/X11/bin:/Developer/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sb
in:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin:/opt/local/sbin:/opt
/local/bin:/usr/texbin
$ []
シェルは、打ち込まれたコマンドを環境変数 PATH の中から探して実行する。 たとえば、ls と打ち込まれると、/bin にある /bin/ls を実行する。

複数のコマンドがみつかれば、PATHの先に見つかったものを実行する。 どのコマンドが実行されるかを確認するには、which コマンドを使う。

$ which ls [←]
/bin/ls
$ []

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

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

■シェル・スクリプト

(よく利用する)シェルに対するコマンドを、ファイルに保存して、(簡単に) 実行できるようにしたもの。簡単なプログラミングとも言える。

◆bash

Coins での標準のログインシェルは、bash。端末(iTerm, xterm, ktermなど)を 開いたり、ssh で遠隔ログインすると、ログインシェルが実行される。

bash (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)

◆シェル・スクリプトの作り方(1):基本

まず端末から実行してみる。

例:サイズが大きいファイルの上位 10 個を表示したい。 ls コマンドと sortコマンドheadコマンドを組み合わせる。

$ ls -l | sort -k 5 -nr | head [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []
echo コマンド、 historyコマンド あるいは、コピー&ペースト機能を用いて 端末から打ち込んだものを結果をファイルに保存する。以下の例では、echo コ マンドを使ってファイルを作成している。
$ []
(^p で1行もどす。)
$ ls -l | sort -k 5 -nr | head [←]
(^a で、行頭に移動して 「echo '」と打ち、^e して
「' > ls-size」 と打つ)
$ echo 'ls -l | sort -k 5 -nr | head' > ls-size10 [←]
$ cat ls-size10 [←]
ls -l | sort -k 5 -nr | head
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  29  6 15 14:38 ls-size10
$ bash ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆シェル・スクリプトの作り方(2):「#!」とchmod +x

シェル・スクリプトを実行する度にいちいち「bash 」と打つのは煩わ しいことがある。その場合は、次のようにする。

1行目にテキスト・エディタで「#!/bin/bash」を書き加える。

$ emacs ls-size10 [←]
(1行目に「#!/bin/bash [←]」と書き加える。)
$ cat ls-size10 [←]
#!/bin/bash
ls -l | sort -k 5 -nr | head
$ []
chmod +x で実行可能属性を付ける
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  41  6 15 14:41 ls-size10
$ chmod +x ls-size10 [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ ~/ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆シェル・スクリプトの作り方(3):~/bin

完成したスクリプトを ~/bin に置くと、他のコマンド(ls, cp, emacs) 等と同じように実行することができる。
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ ls-size10 [←]
-bash: ls-size10: command not found
$ mv ls-size10 ~/bin [←]
$ ls -l ~/bin/ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 /home/prof/yas/bin/ls-size10
$ ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []
ホームディレクトリにある「ls-size10」は、そのままファイル名を打 ち込んでも実行できない。mv コマンドで「~/bin/」に移動した後は、 「ls-size10」で実行可能になる。 (Coins では、標準で ~/bin が PATH に含まれている。)

◆シェル・スクリプトの作り方(4):引数

シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 。 。

ls-size10 では、カレント・ワーキング・ディレクトリ(.)だけ表示できる。他 のディレクトリを表示したい。また、上位 10 個ではなく、5 個、20 個と数を 変えたい。 シェル・スクリプトの名前を 「lss」 とする。

$ cd ~/bin [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ ls -l lss [←]
ls: lss: No such file or directory
$ cp ls-size10 lss [←]
$ ls -l lss [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:46 lss
$ emacs lss [←]
(修正)
$ cat lss [←]
#!/bin/bash
ls -l $2 | sort -k 5 -nr | head -$1
$ []
(cp の時点で x ビットは立っているので chmod +x は不要。)
ls-size10 で ls には引数はなかったが、lss では「$2」を与えている。「$2」 は、コマンドに与えられた引数のうち、2番目のものを意味している。また、 head には -$1 を与えている。

作成したシェルスクリプト「lss」を実行してみる。

$ cd [←]
$ pwd [←]
/home/prof/yas
$ lss 5 /bin [←]
-r-xr-xr-x  1 root  wheel  1315248  2  6  2014 ksh
-r-xr-xr-x  1 root  wheel  1228416  7 21  2016 sh
-r-xr-xr-x  1 root  wheel  1228336  7 21  2016 bash
-rwxr-xr-x  1 root  wheel   530320  2  6  2014 zsh
-rwxr-xr-x  2 root  wheel   357984  2  6  2014 tcsh
$ lss 3 /usr/bin [←]
-r-xr-xr-x   1 root   wheel  11738080  7 21  2016 emacs
-rwxr-xr-x   1 root   wheel  10121104  7 21  2016 php
-r-xr-xr-x   1 root   wheel   5308832  2  6  2014 parl5.16
$ lss 10 . [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆bashスクリプトの引数を参照するためのシェル変数

引数として a b c が与えられた時の実行例。
$ echo $# [←]
3
$ echo $1 $2 $3 [←]
a b c
$ shift [←]
$ echo $# [←]
2
$ echo $1 $2 $3 [←]
b c
$ []

◆bashのコメント

bash では、「#」を使ってコメントを書くことができる。bash は、 文字「#」移行、行末まで無視する。
$ echo a b # c d [←]
a b
$ # echo a b c [←]
$ []

◆bash のコマンドの置換え

bash では、コマンドの標準出力の結果を、別のコマンドの引数に使うことができる。
$ date +%A [←]
金曜日
$ echo Today is `date +%A` . [←]
Today is 金曜日 .
$ []
この例では、バッククォート(` `)で括った部分 が実行され、その結果を echo コマンドの引数に使っている。バッククォート (` `)の代わりに、「$(コマンド)」という形式も 使える。
$ echo Today is $(date +%A) . [←]
Today is 金曜日 .
$ []
コンピュータでは、クォート「'xxx'」とバッククォー ト「`xxx`」は違う。

バッククォートは、シェルスクリプトでもよくつかう。

$ tex=file1.tex [←]
$ basename file1.tex .tex [←]
file1
$ basename $tex .tex [←]
file1
$ base=`basename $tex .tex` [←]
$ echo $base [←]
file1
$ []

◆~/.bashrc

bash は、端末の中で新たに実行されたり(遠隔)ログインの時に新たに実行さ れると、~/.bashrc という名前のファイルにあるプログラムを自動的 に実行する。~/.bashrc では、次のようなことを行う。

◆~/.bashrcの編集は慎重に

~/.bashrc を編集したら、一度、端末プログラムがウィンドウを問題なく開けるか、確 認すると良い。

~/.bashrc に問題があり、端末プログラムがウィンドウを開かなくなった時には、次の ような方法で修正する。

coins で標準の ~/.bashrc は次のようになっている。
$ cat /usr/local/lib/standard/bashrc-home [←]
#
# coins standard ~/.bashrc [←]
#
if [ -f /usr/local/lib/standard/bashrc ]; then
        . /usr/local/lib/standard/bashrc
fi

# add your own code below [←]
$ []

◆~/.bashrcの編集結果の反映

~/.bashrc を編集しても、現在実行中の bash には影響を与えない。

編集内容を有効にするには、次の方法がある。

◆~/.bashrcでのシェル変数の設定の例

シェル変数を使って短い表現を使う場合、 シェル変数の設定を恒久的なものにしたい。 それには、~/.bashrc に保存する。

以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。

$ cat ~/.bashrc [←]
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho.u.tsukuba.ac.jp
...
$ []
これを使うと、ssh が簡単になる。
$ ssh $www [←]
$ ssh $icho [←]

◆~/bin

~/.bashrcなどを設定して、~/bin環境変数PATH に含まれ るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを ~/bin に置くと、ファイル名を指定しなくても (「~/ファイル名」や 「./ファイル」打たなくて)、 ~/bin以下の短いファイル名で実行できるようになる。

coins では、標準で ~/binPATH に含まるように設定されて いるので、各自設定する必要はない。

■bash alias (エイリアス)

■ファイルとディレクトリの木構造を扱うプログラム

標準では単一のファイルやディレクトリを扱うコマンドも、 木構造 を扱うことができるものもある。 木構造をうまく扱うには、「再帰的な(recursively)」処理が重要になる。 これは、自分と同じ処理を、木構造の子供の節にも行うことである。 くわしくは、2年生の「データ構造とアルゴリズム」で扱う。

例:

再帰的な処理を行わせるためには、大文字 -R (recursively) オプションを取 るコマンドも多いが、小文字 -r のものもある。例: scp -r。 大文字でも小文字でもどちらでも受付けるものもある。

何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。

ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。

ファイルのコピーでは、 シンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。

◆コマンドによるファイルの検索

Unix では、次のようなコマンドでファイルの検索ができる。
シェル
ファイル名置換 (*,?,[]) のパタンを使って、ファイル名で検索できる。
find コマンド
ファイル名、属性(所有者、グループ、日付、モード)等で検索できる。 外部のコマンドも実行できる。 。 。
grep コマンド
ファイルの内容で検索できる。 grepコマンド参照。 。 。 。

◆lv

lv コマンドは、less コマンドと同様に、表示しているファイルを検索する機 能がある。次のようなキーが使える。
キー 説明
/パタン 順方向検索
n 順方向検索次候補
/[←] 順方向検索次候補
?パタン 逆方向検索
?[←] 逆方向検索次候補
手引き 2.7.2 参照

■正規表現(regular expression)

単純な検索。 正規表現の例:「^a.*tion$」。「aで始まり、tionで終わるもの」。

^」、「.」、「*」、「$」 は、 メタキャラクタ。特別の意味を持つ。 メタキャラクタを含まない文字列も、正規表現として意味を持つ。

◆正規表現とファイル名置換

ファイル名 置換と grep を使い分ける。orが入っているものは、grep ではなく egrep (eがあるgrep)を使う。
$ cd /usr/bin [←]
$ ls at* [←]
at   atos	atq	atrm	atsutil
$ ls | grep '^at' [←]
at
atos
atq
atrm
atsutil
$ ls *[89]* [←]
c89	tclsh8.4	wish8.4
c99			tclsh8.5	wish8.5
$ ls | egrep '8|9' [←]
c89
c99
tclsh8.4
tclsh8.5
wish8.4
wish8.5
$ []

◆正規表現の詳細

grep コマンド、egrep コマンド、Emacs での正規表現の使い方。

■ファイルの整理

◆quotaコマンド

coins では、ホーム・ディレクトリ以下で個人がファイルを保存するために利 用できるディスクの上限が決まっている。上限や現在の利用量を表示するため には、quota コマンドを使う。 手引き 2.8.1 参照
$ quota -v [←]
Disk quotas for user tcoins1 (uid 19001):
     Filesystem    1K blocks  quota limit     grace  files  quota limit  grace
          /home      1763828     10240000  11264000  12583            0      0
/usr/local/local3          0            0         0      0            0      0
$ []
coins の標準は、上限 11 GB (11*1024 KB)。これを超えると、ファイルを保存で きなくなる。 coins.tsukuba.ac.jpの電子メールも受信できなくなる。 10 GB (10*1024 KB) を超えると、警告のメールが飛ぶ仕組みがあるが、メール が飛ばないこともあるので、各自自分で気をつける。 手引き 10.9 ディスククォータに関する警告メールが来てしまった 参照

上のユーザは、/home の領域で 1,763,828 KB 使っている。 ファイル数は、12583 個。ファイル数の上限は、設定されていない。

quota limit を超えた時には、 不要なファイルを消す。

注意: macOS の「ゴミ箱」に入っているファイルもディスク容量を使用してい る。「ゴミ箱を空にする」という操作を行って初めて使用中のバイト数が減る。

◆duコマンド

。 ホーム・ディレクトリ全体ではなく、個々のディレクトリごとに ディスク使用量を調べたい時には、 du コマンド を使う。引数に調べたいディレクトリ名を与える。ディレクトリ名としては、 「.」や「~」も可。du は、ファイルの数が多い時に表示までに時間がかかる。 途中でやめたくなった時には、 ^C (Control+C) で強制終了する。
$ du ~ [←]
(ホーム・ディレクトリ以下のファイルの容量を表示)
$ du . [←]
(カレントワーキング・ディレクトリ以下のファイルの容量を表示)
$ du -s . [←]
(-s で合計だけ表示)
$ du -s -k . [←]
(-k で KB 単位で表示)
$ du -s -k * [←]
(指定されたディレクトリ(*なのでそこにあるもの全部)単位で合計の表示)
$ du -s -k * | sort -nr | head [←]
(合計を大きい順にソートし、その先頭 10 行を表示)
man du、 手引き 2.8.2 du コマンド 参照 手引き 10.9 ディスククォータに関する警告メールが来てしまった 参照

■キャッシュ

キャッシュ(cache)とは、高速化のための小容量のメモリ。

◆キャッシュの問題

キャッシュを消しても、遅くなるだけで、他の問題は生じない。

◆Web ブラウザのキャッシュ

Web ブラウザは、画像等をファイルにキャッシュとして保存することがある。 そのキャッシュが、知らない間に quota を圧迫し、必要なファイルが保存できなくなることがある。 それを付けるために、次のどれかを行う。

◆「ダウンロード」ディレクトリ

Web ブラウザやメール・リーダが「ダウンロード」ディレクトリ (~/Downloads/)にファイルを保存することがある。 ここにある不用なファイルは削除すべきである。

◆macOSのアプリケーションのキャッシュ

macOS のアプリケーションのいくつかは、~/Library/Caches/ 以下に キャッシュとなるファイルを作成する。quota を圧迫している場合や、アプリ ケーションが(古いキャッシュを参照して)うまく動作しない場合には、 rm -r等で削除する。
$ du -s ~/Library/Caches/* [←]
1 /home/prof/yas/Library/Caches/Adobe
10516	/home/prof/yas/Library/Caches/Firefox
15642	/home/prof/yas/Library/Caches/Google
40	/home/prof/yas/Library/Caches/Metadata
4	/home/prof/yas/Library/Caches/Mozilla
13	/home/prof/yas/Library/Caches/com.apple.DictionaryManager
11	/home/prof/yas/Library/Caches/com.apple.DictionaryServices
5	/home/prof/yas/Library/Caches/com.apple.Safari
66	/home/prof/yas/Library/Caches/com.apple.nsservicescache.plist
25	/home/prof/yas/Library/Caches/com.apple.preferencepanes.cache
320	/home/prof/yas/Library/Caches/com.apple.preferencepanes.searchindexcache
0	/home/prof/yas/Library/Caches/com.apple.tiswitcher.cache
2120	/home/prof/yas/Library/Caches/com.google.SoftwareUpdate
$ []

■Unixコマンドによるファイルの整理

ホーム・ディレクトリ ~、デスクトップ ~/Desktop や 書類 のディレクトリ ~/Documents に、多くのファイルを放置することはよ くない。ディレクトリを作成し、整理すべきである。 1つの目安は、ls コマンドで 1画面に入らない時には分割する。

◆ファイルとディレクトリの操作の復習

ファイルを操作する基本的なコマンド
ls
ls -l
ls -ld
ls -a
ls file1 file2
ls file*

mkdir dir
rmdir dir

cp file1 file2
cp file1 file2 dir1
cp dir/file1 .

mv file1 file2
mv file1 file2 dir1
mv dir/file1 .

rm file1 file2

◆rm コマンドの -i オプション

rm コマンドには、-i オプションがあり、ファイルを消すかどうかを対話的 (interactive)に y/n で聞いてくる。消してもよい時には、y と答える。

$ ls -l [←]
total 1
-rw-r--r--  1 yas  prof  2  6 15 21:48 file1
$ rm -i file1 [←]
remove file1? y[←]
$ ls -l [←]
$ []

シェルスクリプトや bashのエイリアス で、rm を自動的に rm -i に変えることは、一般的には勧められない。「rm -i [←] y」という操 作が、一連の操作として身に付いてしまうので。

◆rm コマンドの -f オプション

rm コマンドは、書き込みできないファイル(モードが r--r--r-- の様に w が ないファイメッセージ) を削除しようとすると、-i オプションをつけていなく ても利用者に問い合わせてくる。これに対して y と答えると削除される。
$ ls -l [←]
total 1
-r--r--r--  1 yas  prof  2  6 15 21:44 file1
$ rm file1 [←]
override r--r--r--  yas/prof for file1? y[←]
$ ls -l [←]
$ []
書き込みできないファイルでも、-f オプション(force) をつけると、rm コマ ンドは、利用者に問い合わせることなく黙って削除する。
$ ls -l [←]
total 1
-r--r--r--  1 yas  prof  2  6 15 21:53 file1
$ rm -f file1 [←]
$ ls -l [←]
$ []

◆ファイルサーバによる自動バックアップ

coins のホームディレクトは、ファイルサーバにより自動的にデータのバックアップがなされている。 rm コマンドで削除したファイルも、約1週間以内なら復元できることがある。 手引き 10.12 間違えてファイルを消してしまった 参照

◆rm -r

rm コマンドに -r オプションをつけると、指定されたディレク トリ以下の全てのディレクトリを削除する。
$ rm -r dir [←]
rm -r でも、書き込みできないファイルが含まれている時には、利用者 に問い合わせる。そのような問い合わせを行うことなく強制的に削除したい時 には、 -f オプション をつけることもできる。
$ rm -rf dir [←]
rm -rは非常に危険なので、細心の注意にはらって実行すること。

■Emacs(2)

複数のファイルを扱う方法と検索

◆insert-file

Emacs にはファイルを挿入する機能がある。

◆タブ・キー

Emacs のタブ・キーは、単にタブを打ち込むのではなく、自動的な字下げ(イン デント)の機能が働くことがある(indent-for-tab-command)。

端末の結果を、emacs にコピーする時に、タブをタブとして挿入し たい時には、M-x local-set-key で、次のようにタブ・キーの定義を self-insert-command に変更する方法がある。

M-x local-set-key[←]
[tab]
self-insert-command[←]

◆カーソル移動

矢印キー(←、→、↑、↓)だけでなく、次のキーを使えるようにする。
C-b	backward-char
C-f	forward-char
C-p	previous-line
C-n	next-line

C-v	scroll-up       	次のページへ移動
M-v	scroll-down     	前のページへ移動
M-<	beginning-of-buffer	ファイルの先頭へ移動
M->	end-of-buffer   	ファイルの末尾へ移動
M-v は、 Esc v、つまり、Esc キーを打ち、(Esc キーを離し)、v キーを打つ。

◆ファイルの編集の基本

◆別のファイルへ保存

読み込んだファイルとは別のファイルに保存することができる。 前回のレポートを修正する時に便利。早めに C-x C-w で書き込むこと を奨める。さもないと元のファイルを壊してしまうことになる。

類似のことは、cp コマンド等で元のファイルを別のファイルにコピーしてから、 別のファイルを Emacs で修正してもできる。

◆Emacs のバッファとウィンドウ

手引き 3.5.2 画面の分割 参照 Emacs のバッファは、ハードウェアのメモリを抽象化したもの。ファイルの内 容を読み込み、編集できる。保存しなければ、失われる。

Emacs でウィンドウとは、バッファの一部を表示する画面。 。 。

Emacs のウィンドウ、一部表示、バッファ、ファイル、読み込み、保存
図? Emacsのウィンドウとバッファとファイルの関係

キー 説明
C-x 2 ウインドウを2つに分割(現在のバッファを複数ウインドウで表示)
C-x 1 ウインドウを1つにする(他のウインドウを閉じる)
C-x 0 現在のウインドウを閉じる
C-x o 他の(other)ウインドウにカーソルを移動。
C-x C-b バッファのリストを表示
C-x b 別のバッファを表示する

◆Emacs のバッファとウィンドウの使い道の例

Emacs には、通常の検索とインクリメンタルな検索の2種類の検索がある。 手引き 3.3.7 検索・置換 参照 インクリメンタル・サーチの途中で、検索する文字を打つ代わりに、C-s, C-r を打つと次に見つかった場所にカーソルが移動する。

◆Emacsの検索と文字列の置換え

手引き 3.3.7 参照

M-x query-replace (M-%, Esc %) が便利。

M-% と打つと、ミニバッファで次のように聞かれる。

Query replace: 置き換え前の文字列[←]
Query replace 置き換え前の文字列 with: 置き換え後の文字列[←]
キー意味
y (または SPC) 置き換え
n 次の候補に移動
q 終了
! 以降すべて置換
練習問題 Emacs query-replace

その他に、次のような置換え機能がある。 。

■World Wide Web、ホームページ

情報科学類のコンピュータにアカウントがある人は、 HTML ファイルや PNG 形式等の画像ファイルを ホームディレクト以下に置く事で、 個人のホームページを作成することができる。

◆情報科学類での個人のホーム・ページ

筑波大学情報学類コンピューティング環境では、個人の WWW ページは、次のよ うな URL で参照される。 ここで「ユーザ名」を、ログインの時に打つ自分のユーザ名 で置き換える。たとえば、学籍番号が 202054321 の人は、次のような URL で 参照される。 この URL は、次のディレクトリに対応する。 このディレクトリは、mkdir コマンドで作成できる。
$ mkdir ~/public_html [←]
$ mkdir ~/public_html/htdocs [←]
http: ではなく https: が使いたい人は、次のような URL を使う。 この https の URL は、次のディレクトリに対応する。 このディレクトリは、mkdir コマンドで作成できる。
$ mkdir ~/public_html [←]
$ mkdir ~/public_html/secure_htdocs [←]
mkdir の後、 ディレクトリのxの働き を理解し、 ホームディレクトと作成したディレクトリに対して chmod コマンド で others に対して x ビットを立てる必要がある。 練習問題 Webページ用のディレクトリ作成 参照。

このディレクトリに index.html というファイルを作成すれば、 それが情報科学類での個人のホーム・ページの内容となる。

■Web アクセスログ

アクセスログとエラーログ

Web サーバは、ページがアクセスされる度に記録を残す。この記録をアクセス ログという。アクセスログは、情報科学類のサーバ www (www.coins.tsukuba.ac.jp) では、次の場所にある。
http
/var/log/httpd/access*
https
/var/log/httpd/ssl_access*
この中で、数字が一番大きなもの、または、日付が新しいものが、 現在増加しているログである。
$ cd /var/log/httpd/ [←]
$ ls    access* | tail -1 [←]
$ ls -t access* | head -1 [←]
以下の例では、現在増加しているログは access_log_20210609 である。
$ cd /var/log/httpd/ [←]
$ ls access*     | tail -1 [←]
access_log_20210609
$ ls  -t access* | head  -1 [←]
access_log_20210609
$ []
以下は、アクセス・ログの内容の例である。見やすいように改行を入れているが 実際には1行が1つのページの転送を意味する。
2001:2f8:3a:1711::230:30 - - [14/Jun/2021:10:04:32 +0900] "GET /~syspro/2021/202
1-06-16/ HTTP/1.1" 200 77088 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; 
rv:89.0) Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2021:10:04:32 +0900] "GET /~syspro/2021/202
1-06-16/images/www-cgi.png HTTP/1.1" 200 15499 "http://www.coins.tsukuba.ac.jp/~
syspro/2021/2021-06-16/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0)
 Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2021:10:05:32 +0900] "GET /~syspro/2021/202
1-06-16/cgi-printarg.cgi?lastname=name1&firstname=name2&lang=C&email=who%40dom H
TTP/1.1" 200 443 "http://www.coins.tsukuba.ac.jp/~syspro/2021/2021-06-16/" "Mozi
lla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0) Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2021:10:06:23 +0900] "POST /~syspro/2021/20
21-06-16/cgi-printarg.cgi HTTP/1.1" 200 375 "http://www.coins.tsukuba.ac.jp/~sys
pro/2021/2021-06-16/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0) Ge
cko/20100101 Firefox/89.0"
このログは、設定ファイル /etc/httpd/conf/httpd.conf にある CustomLog 等の設定による。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs_http/access_log_%Y%m%d 20M" combined
combined という名前が付けられたログのフォーマットの意味は、以下の通りである。

アクセスログの他に、エラーが起きた時にもログが作られる。これを エラーログ という。エラーログは、情報科学類のサーバ www (www.coins.tsukuba.ac.jp) では、次の場所にある。

http
/var/log/httpd/error_log_*
https
/var/log/httpd/ssl_error_log_*
CGI のプログラムをデバッグする時には、このエラーログを見て原因を探る。

その他に、次のようなログを取ることもある。

ssl_request_log (coins では /var/log/httpd/ssl_request_log_*)
SSL のプロトコル等
/var/log/httpd/suexec.log 等 (coins では /var/log/secure)
suExec を使っていた時のログ

練習問題 学類 Web サーバのアクセス・ログの観察練習問題 学類 Web サーバのアクセス・ログの観察(https) 参照。

■Webページに対するアクセス制御と認証

■coins.tsukuba.ac.jp のメール

情報科学類のコンピュータにアカウントがある人は、次のメールアドレスが使えるようになっている。 coins では新たにメールアドレスを作成する必要はない。 このアドレスには、情報科学類内の重要な案内や教員からの連絡が届くことがあるで、毎日、チェックしたい。

◆メールリーダの設定

自分が普段使っているメール・リーダに@coinsのメールをアクセスするための設定を追加すると良い。 そのために必要な情報は、次の場所にある。

◆@coinsのメールを Web ブラウザで読み書きする

@coinsのメールを Web ブラウザで読み書きすることもできる。 次のURL にアクセスすれば良い。 くわしい使い方は、次の場所にある。 情報科学類の Web メールを使う時には、手引きの方法に従い、「表示名(display name)」を設定すること。 これは、自分が書いた電子メールの差出人(From:)に現れる。

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

メール・リーダの操作 には、受け取ったメールを他のユーザへ 手動で 転送(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 にも送られる。

転送におけるループの危険性

複数のメール・アドレスがある人は、どのホストにログインした時にも、全部 のホストに届いた電子メールが読める状態にしたいと思うかもしれない。 上の例では、 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 (Mail Transfer Agent)の機 能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。

◆筑波大学全学計算機の転送機能

筑波大学全学計算機の電子メール機 能( @s.tsukuba.ac.jp )には、転送機能がある。 練習問題 全学計算機の転送機能 参照。

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

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

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

■練習問題

練習問題は、時々更新する。 レポート課題は、それとは別に、ページの末尾にある。

◆プロセス

練習問題(3001) psコマンド

手引き 2.10.1 ps コマンド 参照

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

$ ps [←]

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

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
ps コマンドにオプションを与える方法として、「-」を付ける方法と付けない 方法がある。「-」の有無で表示が変わることがある。
$ ps l [←]
$ ps -l [←]
「-」の有無で、使い方が違うことがある。
$ ps u [←]
$ ps -u ログイン名 [←]

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

練習問題(3003) 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
大文字小文字を無視する
この動きを確認しなさい。

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

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。次の例は、bash コマンド、 および、iTerm の中で実行している Emacs のプロセスを探している。
$ ps | grep bash [←]
34121 ttys000    0:00.03 -bash
75409 ttys000    0:00.00 grep bash
75195 ttys001    0:00.01 -bash
34226 ttys002    0:00.05 -bash
75399 ttys003    0:00.01 -bash
$ ps | grep Emacs [←]
75412 ttys000    0:00.00 grep Emacs
75404 ttys003    0:00.09 /Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs -nw literacy-a7.txt
$ []
この機能を利用して見なさい。

端末と結びついていないプロセスを調べるには、ps コマンドに x オプション を与える。次のようにして、Finder、Dock、Emacs、Firefox 等のプロセスの PID を調べなさい。

$ ps x | grep    Finder [←]
$ ps x | grep    Dock [←]
$ ps x | grep    fire [←]
$ ps x | grep    iTerm [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。このことを確認しなさい。
$ ps x | grep -i finder [←]
$ ps x | grep -i dock [←]
$ ps x | grep -i fire [←]
$ ps x | grep -i iterm [←]

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

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

練習問題(3006) ps u

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Application
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.10 ssh www.coin
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.03 -bash
$ []
%CPU
過去1分間に利用した CPU 時間の割合。
%MEM
実際に消費してるメイン・メモリの大きさの割合。
VSZ (Virtual Size)
仮想記憶上のプロセスの大きさ。KB 単位。
RSS (resident set size)
実際に消費してるメイン・メモリの大きさ。
STARTED
プロセスが生成された時刻。

練習問題(3007) ps lと親プロセス

psコマンドに「l」オプション(long)をつけると親プロセスのプロセス識別子が PPIDのところに表示される。 このこと確認しなさい。
$ ps l [←]
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
 1013   912   911   0  31  0  2452824   1332 -      S    s000    0:00.04 -bash
 1013   947   945   0  31  0  2461016   1248 -      S    s001    0:00.02 -bash
 1013   988   947   0  31  0  2461144   2184 -      S+   s001    0:00.12 ssh ww
 1013  1027  1024   0  31  0  2452824   1312 -      S    s002    0:00.01 -bash
 1013  1070  1027   0  33  0  2508388  17016 -      S+   s002    0:00.09 /Appli
$ []
PID 988 の ssh の親プロセスは、PID 947 の bash。 PID 1070 の Emacs の親プロセスは、PID 1024 の bash。

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

ps コマンドは、端末の横幅に合わせて表示する。 長い COMMAND が途中で切れてしまう。 表示を増やすには、次の方法がある。 次のように、w オプションの効果を確認しなさい。
$ ps u [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Application
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.19 ssh www.coin
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.04 -bash
$ ps uw [←]
USER   PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
yas   1070   0.0  0.1  2508388  17016 s002  S+    5:40PM   0:00.09 /Applications
/MacPorts/Emacs.app/Contents/MacOS/Emacs -nw
yas   1027   0.0  0.0  2452824   1312 s002  S     5:33PM   0:00.01 -bash
yas    988   0.0  0.0  2461144   2184 s001  S+    5:25PM   0:00.19 ssh www.coins
.tsukuba.ac.jp
yas    947   0.0  0.0  2461016   1248 s001  S     5:25PM   0:00.02 -bash
yas    912   0.0  0.0  2452824   1332 s000  S     5:23PM   0:00.04 -bash
$ []
iTerm の画面を横幅を広げて ps コマンドを打ちなさい。 横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。

練習問題(3009) topコマンド

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

練習問題(3010) topコマンドのkillによる強制終了

top コマンドのプロセスを kill コマンドで殺してみなさい。

練習問題(3011) ^Dによるcatコマンドの終了

cat コマンドと 標準出力の切り替え で短いファイルを作 成してみなさい。
$ cat > file1.txt [←]
Line 1[←]
Line 2[←]
^D
$ cat file1.txt  [←]
Line 1
Line 2
$ []

練習問題(3012) ^Cによる cat コマンドの強制終了

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

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

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

練習問題(3014) yesコマンドの強制終了

yes コマンドは、端末に y と表示し続けるコマンドである。 普通、終了することはないので、強制終了が必要になる。 次のように実行すると、最初の 10 行だけ表示する。
$ yes | head [←]
y
y
y
y
y
y
y
y
y
y
$ []
yes コマンドは普通、終了しないので、最後の 10 行を表示しようと tail コ マンドを使っても表示されない。
$ yes | tail [←]
この時、別の端末で yes コマンドのプロセスを kill してみなさい。
$ ps [←]
(yes のプロセスの PID を調べる)
$ kill PID [←]
$ []
yes のプロセスが終了すると、tail コマンドが最後の 10 行を表示する。 このことを確認しなさい。

yes と tail を ^C で強制終了するとどうなるか。調べなさい。

$ yes | tail [←]
^C
$ []
yes コマンドと lv コマンドを実行するとどうなるか調べなさい。
$ yes | lv [←]
yes コマンドを単独で実行し、^C で停止しなさい。
$ yes [←]
...
^C
$ []
cat -n と合わせて実行し、必要なら強制終了しなさい。
$ yes | cat -n [←]
$ yes | cat -n | lv [←]
$ yes | cat -n | head [←]
$ yes | cat -n | tail [←]

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

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

練習問題(3016) killコマンド

手引き 2.10.2 参照

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

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

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

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

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

練習問題(3018) ps | grep、kill

次の一連の操作を行いなさい。
$ ps 引数 | grep オプション パタン [←]
$ kill  [←]
たとえば、次の例のように、 PaperCut のプロセスを探して、殺してみなさい。
$ ps x | grep -i paper [←]
94070   ??  SN     0:01.40 /Applications/PCClient.app/Contents/MacOS/JavaAppLauncher biz.papercut.pcng.client.uit.UserClient
(端末がないので、ps に x オプションをつける。grep に -i オプションをつけて、大文字小文字を無視する。)
$ kill 94070 [←]
(単に kill だけでは、プロセスは死んでいない。)
$ kill 94070 [←]
(2回目にエラーが出ないので、プロセスが生きていることがわかる。)
$ kill -KILL 94070 [←]
$ kill -KILL 94070 [←]
-bash: kill: (94070) - No such process
(2回目にエラーが出たので、プロセスが死んでいることがわかる。)
$ ps x | grep -i paper [←]
94192 s000  S+     0:00.00 grep -i paper
(ps コマンドでも表示されない。)
$ []

練習問題(3019) ps lによるプロセスの木構造の確認

ps l コマンドを使うと、親プロセスの PID が表示される。 この仕組みを使って、親プロセスの親プロセスを調べなさい。 さらに、その親プロセスを調べなさい。

次の例は、bash の親プロセス、その親プロセス、さらにその親プロセスを調べ て、iTerm であることを突き止めている。

$ ps alx | grep bash [←]
 1013  1506  1230   0  31  0  2436436   1032 -      S      ??    0:00.00 /bin/bash /usr/local/MacGPG2/libexec/shutdown-gpg-agent
 1013  1643  1642   0  31  0  2461016   1336 -      S    s000    0:00.01 -bash
 1013  1609  1608   0  31  0  2461016   1312 -      S    s002    0:00.01 -bash
 1013  1654  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep bash
$ ps alx | grep 1608 [←]
    0  1608  1602   0  33  0  2469444   2388 -      Us   s002    0:00.01 login -fp yas
 1013  1609  1608   0  31  0  2461016   1312 -      S    s002    0:00.01 -bash
 1013  1656  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep 1608
$ ps alx | grep 1602 [←]
 1013  1602  1230   0  49  0  2598208  44240 -      S      ??    0:00.99 /Applications/iTerm.app/Contents/MacOS/iTerm
    0  1642  1602   0  33  0  2468920   2432 -      Ss   s000    0:00.01 login -fp yas
    0  1608  1602   0  33  0  2469444   2388 -      Us   s002    0:00.01 login -fp yas
 1013  1658  1609   0  31  0  2432784    604 -      S+   s002    0:00.00 grep 1602
$ []
  1. bash のプロセスの PID は、1643 と 1609 。そのうち、PID が 1609 の PPID は、1608 。
  2. PID が 1608 のものを探すと、login というプロセスである。その PPID は、1602 。
  3. PID が 1602 のものを探すと、iTerm である。

最後は、PID が 1 番のプロセスにたどりつく。このことを確認しなさい。

練習問題(3020) pstreeコマンド

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

練習問題(3021) Command+Option+Esc

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

(まず、Commandキー(Command) と Option キーを左手で押し、 押しっぱなしの状態で、右手で Esc キーを一度押して離す。) 左上のアップル・メニュー(リンゴのアイコン)を押し、 「強制終了」を選んでも良い。

Command+Option+Escキー
「アプリケーションの強制終了」のウインドウ

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

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

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

アクティビティモニタの表示 (クリックで拡大)
アクティビティモニタの表示

表示されたら、「CPU」タブを表示しなさい。そして、 表示されるプロセスの順序を変えてみなさい。

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

練習問題(3023) 「アクティビティモニタ.app」によるメモリ使用量の調査

アクティビティモニタ.appを実行しなさい。 「CPU」タブではなく、「メモリ」タブを開きなさい。プロセスをメモリの使用 量の順に表示しなさい。

練習問題(3024) 「アクティビティモニタ.app」によることえりのプロセスの表示と再起動

次の手順で、マウスだけを用いて 「「アクティビティモニタ.app」」を実行しなさい、
  1. Dock の Finder をクリックする等して、Finder をアクティブにする( メニューバーを表示する。)
  2. 一番上のメニューバーにある「移動」メニューから「ユーティリティ」を 選ぶ。または、Finder のウィンドウのサイドバーにある「アプリケーショ ン」のフォルダを開き、その中で「ユーティリティ」のフォルダを開く。
  3. 「アクティビティモニタ.app」をダブルクリックで実行する。
  4. 「CPU」タブを選択する。
  5. 「プロセス名」をクリックして、プロセス名の順番に並べ替えると探しやすい。
  6. 「日本語入力プログラム」をクリックして選択する。
ビーチボールが出ていて、キーが反応しない時には、 「日本語入力プログラム」が「(反応なし)」と赤くなっている。

アクティビティモニタの表示、日本語入力プログラム、反応なし (クリックで拡大)
アクティビティモニタの表示、日本語入力プログラム、反応なし

この場合、次の手順で「日本語入力プログラム」のプロセスを殺しなさい。

  1. 殺したいプロセス(日本語入力プログラム)をクリックして選ぶ。
  2. 「x」ボタンを押す。 すると、「このプロセスを強制終了してもろしいですか」と表示される。
  3. 「強制終了」のボタンを押す。
ことえりのプロセスを殺すと、もう一度ことえりが自動的に実行され、 ことえり(日本語入力プログラム)のプロセスが再び現れる。

練習問題(3025) Windows タスクマネージャー

手引き 5.6節 参照

「プロセス」のタブでは、CPU 時間の順番やメモリ使用量の順番に並べ替えな さい。

強制終了しても問題がなさそうな「アプリケーション」や「プロセス」を、強 制終了してみなさい。

◆標準出力の切り替え

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

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

$ []

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

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

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

練習問題(3029) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2022-567.txt [←]
ls: cal-2022-567.txt にアクセスできません: そのようなファイルやディレクトリはありません
$ cal 5 2022 >  cal-2022-567.txt [←]
$ cal 6 2022 >> cal-2022-567.txt [←]
$ cal 7 2022 >> cal-2022-567.txt [←]
$ cat cal-2022-567.txt [←]
      5月 2022
日 月 火 水 木 金 土
 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月 2022
日 月 火 水 木 金 土
          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月 2022
日 月 火 水 木 金 土
                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
$ ls -l cal-2022-567.txt [←]
-rw-r--r--. 1 yas prof 452  3月 22 18:06 cal-2022-567.txt
$ []

練習問題(3030) lvコマンド

lv コマンド の使い方を復習しなさい。次のキーを確認しなさい。 次のファイルを lv コマンドで表示してみなさい。
$ lv /usr/share/dict/words  [←]
$ lv /etc/services [←]

練習問題(3031) lsとパイプ(1)

ls コマンドは、出力が端末かパイプかで表示方法を変える。 パイプの場合、縦になる。
$ ls [←]
file1.txt	file2.txt
$ ls | cat [←]
file1.txt
file2.txt
$ []
このことを確認しなさい。
$ ls [←]
$ ls | cat [←]
$ ls | lv [←]
ls-1 オプションは、(端末でパイプでも)縦に表示するオプ ションである。-1 は、数字の 1 であり、アルファベットの L の小文字の l ではない。ls-C オプショ ンは、(端末でパイプでも)横に表示するオプション。
$ ls [←]
file1.txt file2.txt
$ ls -1 [←]
file1.txt
file2.txt
$ ls -C [←]
file1.txt file2.txt
$ ls -C | cat [←]
file1.txt file2.txt
$ []
このことを確認しなさい。

練習問題(3032) lsとパイプ(2)

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

練習問題(3033) psとパイプ

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

練習問題(3034) macOS pbpaste コマンド

Web ページや iTerm の結果結果を Emacs にペーストする時に、タブが含まれ ているために、自動的に字下げが行われて、表示が 乱れてしまうことがある。この問題は、 macOS なら pbpaste コマンドと Emacs C-x i (insert-file) で解決できる。このことを確認しなさい。

まず、pbpaste コマンドを使って、Web ページの一部やiTerm の表示の一部を ファイルに保存しなさい。

  1. Web ブラウザで Web ページを表示する。あるいは、 iTerm で、コマンドを実行する。
  2. その一部をマウスで選択し、コピーする (メニューバーの「編集」メニューの「コピー」を選ぶ。)
  3. 端末で pbpaste コマンドを実行する。
    $ pbpaste > file1.txt [←]
    
  4. Emacs を実行する。
    $ emacs file2.txt [←]
    
  5. 先ほど保存したファイルを、 Emacs C-x i (insert-file) で読み込む。

練習問題(3035) macOS pbcopy コマンド

macOS の pbcopy コマンドを使って 端末でアクセスできるファイルや、コマンドの結果を Thunderbird や別の iTerm にコピーしてみなさい。
  1. コピーしたいファイルを標準入力として pbcopy コマンドを実行する。
    $ pbcopy < ファイル名 [←]
    
    cat コマンドとパイプを使う方法もある。
    $ cat ファイル名 | pbcopy [←]
    
    cat コマンドではなく、他のコマンドでも良い。
    $ ps    | pbcopy [←]
    
    $ ls -l | pbcopy [←]
    
  2. Thunderbird や別の iTerm で、ペーストの動作を行う。 (メニューバーの「編集」から「ペースト」を選ぶ、等。)

練習問題(3036) expand コマンド

iTerm の結果結果を Emacs にペーストする時に、タブが含まれているために、 自動的に字下げ が行われて、表示が乱れてしまうことがある。 expand コマンドをつかうと、タブを空白に置き換えてくれる。
$ ls [←]
(タブ入りの表示、横)
$ ls | expand [←]
(タブを含まない表示、縦)
$ ls -C | expand [←]
(タブを含まない表示、横)
$ ls -C | expand | pbcopy [←]
(タブを含まない表示が、クリップボードにコピーされる。画面には表示されない。)
$ []
この動きを確認しなさい。 。 。

練習問題(3037) Emacs shell-command

Emacs には、shell-command という機能があり、 Emacs が iTerm のような働きをして、その中で shell を実行することができる。
M-x shell-command[←]
この機能を、C-u (Control+u) を付けて実行すると、コマンドを実行 してその結果を現在編集中のファイル(バッファ)に挿入できる。
C-u M-x shell-command[←]
Shell command: 実行したいコマンド[←]
この機能を確認しなさい。

練習問題(3038) Windows コマンドプロンプトや Powershell での標準入出力の切り替え

「コマンドプロンプト」では、Unix のシェルと同様に、 標準入出力の切り替え(redirection リダイレクション) が行なえることを確認しなさい。
dir > files.txt
type files.txt
type files.txt | more

◆ファイルの属性、アクセス制御

練習問題(3039) whoami,groups,idコマンド

whoami, groups, idコマンドを使って、プロセス(シェル)のUID, GID, groups 属性を表示しなさい。
$ id [←]
$ whoami [←]
$ groups [←]

練習問題(3040) 他人から読み書き可能な自分のファイル

ルートからホームディレクトリにいたる間でのディレクトリのモードを調べな さい。
$ echo ~ [←]
$ ls -ld / [←]
$ ls -ld /home [←]
$ ls -ld /home/ugrad/ [←]
・・・中略・・・
$ ls -ld  ~ [←]
ディレクトリ ~/public_html, ~/public_html/htdocs や ~/public_html/index.html のモードを調べな さい。
$ ls -ld ~/public_html [←]
$ ls -ld ~/public_html/htdocs [←]
$ ls -l  ~/public_html/htdocs/index.html [←]
他の人(WWWページとして公開するために、WWWサーバ・プロセスからのアクセ スも含む)がアクセスしようとしたらどうなるかを考察しなさい。

その他に、次のファイルやディレクトリのモードを調べなさい。

練習問題(3041) 自分が読み書き可能な他人のファイル

他人のファイルで、内容を読む事ができるファイルを読みなさい。 たとえば、新城のファイルを読むには次のようにする。
$ cd ~yas [←]
$ ls -l [←]
$ ls -l literacy-a* [←]
$ lv literacy-a2.txt [←]
$ lv literacy-a3.txt [←]
$ []

練習問題(3042) アクセス不可能な他人のファイル

他人のファイルで、内容を読む事がでないファイルを読もうとしてみなさい。  たとえば、新城のファイルを読もうとするには次のようにする。
$ cd ~yas [←]
$ ls -l [←]
$ ls -l literacy-a* [←]
$ lv literacy-a4.txt [←]
$ lv literacy-a5.txt [←]
$ []

練習問題(3043) 他人のプロセスのkill

ps コマンド、grep コマンド、lv コマンド等で、他人のプロセスの PID を調 べなさい。その PID を使って、他人のプロセスを kill してみなさい。その結 果、そのプロセスがどうなるかを調べなさい。

練習問題(3044) chmod コマンド

chmod コマンドで、ファイルやディレクトリのモードを変更しなさい。 以下の例は、file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み 可」の許可を取り除いている。
$ ls -l file1.txt  [←]
-rw-r--r--  1 yas  prof  2  5 10 18:59 file1.txt
$ chmod go-r file1.txt  [←]
$ ls -l file1.txt  [←]
-rw-------  1 yas  prof  2  5 10 18:59 file1.txt
$ []
go-r を含めて、様々なモードの設定方法がある。 次の設定方法の意味を確認しなさい。

練習問題(3045) WWWページのファイルのモード

WWW ページとして公開するファイルのモードはその他(others)に対するアクセ ス許可で r ビットが立っている必要がある。もし、このビットを chmod o-r で落した場合、Web ブラウザでアクセスできなくなる。このことを確かめなさ い。

$ cp sample1.html sample2.html  [←]
<アクセス制御のテスト用のファイルを cp コマンドで作成する。>
$ ls -l sample2.html  [←]
-rw-r--r--  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ chmod o-r sample2.html  [←]
$ ls -l sample2.html  [←]
-rw-r-----  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ chmod o+r sample2.html  [←]
$ ls -l sample2.html  [←]
-rw-r--r--  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ []

同様に、ディレクトリを作成し、その他(others)に対する x ビットを立てたり 落したりしながら、その効果を確認しなさい。

$ cd ~/public_html/htdocs [←]
$ mkdir dir1 [←]
$ emacs dir1/file1.html [←]
$ ls -ld dir1 [←]
$ ls -l dir1/file1.html [←]
<Firefoxでアクセス、再読み込み等>
$ chmod o-x dir1 [←]
$ ls -ld dir1 [←]
<Firefoxでアクセス、再読み込み等>

練習問題(3046) 8進数を利用したchmodコマンド

chmod コマンドは、モードを8進数で与えることもできる。 。 。 また、利用してみなさい。 8進数で指定することの利点を考えなさい。

練習問題(3047) umaskの影響調査

新しく生成されるファイルは、マスク、または、umask の影響を受ける。 。 。 このことを確認しなさい。

練習問題(3048) chgrp コマンド

chgrp コマンドで、ファイルやディレクトリのGID属性を変更しなさい。
$ ls -l file1.txt [←]
(ファイルのグループの表示)
$ id [←]
(自分(プロセス)が属しているグループの表示)
$ chgrp グループ file1.txt [←]
$ ls -l file1.txt [←]
(ファイルのグループの表示)
$ []
まず、適当な内容を持つテキスト・ファイルを作成しなさい。
$ echo hello > file1 [←]
$ ls -l file1 [←]
-rw-r--r--  1 yas  prof  6  5 23 22:28 file1
$ cat file1 [←]
hello
$ []
そして、次のような要求を満たすように chmod コマンドを使ってモードを変更 しなさい。提出するファイルには、chmod コマンドをどのように利用したか、 また、その結果 ls -l の表示がどのようになったかを含めなさい。

練習問題(3049) mkdirとchmodによる drop box ディレクトリの実装

同じコンピュータ(ファイルサーバ)を共有しているユーザ間で秘密のファイ ルを受け渡しする方法として、受信側のディレクトリに drop box となる ディレクトリを作成する方法がある。このディレクトリは、 次のようなモードを持つ。
$ ls -ld dropbox [←]
drwx-wx-wx  2 yas  prof  80  5 22 15:28 dropbox
$ []
送信側は、受信者が読めるモードで、ファイルを作成し、受信者の drop box ディレクトリの下にコピーする。
$ emacs file-2022-05-18.text [←]
$ ls -l file-2022-05-18.text  [←]
-rw-r--r--  1 yas  prof  56353  5 22 15:38 file-2022-05-18.text
$ cp file-2022-05-18.text ~user/dropbox [←]
$ []
送信者は、このディレクトリから目的の取り出す。cp コマンド等でファイルを コピーし、元のファイルを rm コマンド等で削除する。

このような drop box を用いて、隣の人、あるいは、その他の友人にファイルを渡しなさい。 同様に、ファイルを受け取りなさい。

$ ls -l file-2022-05-18.text  [←]
-rw-r--r--  1 yas  prof  56353  5 22 15:38 file-2022-05-18.text
$ cp file-2022-05-18.text ~ [←]
$ rm file-2022-05-18.text [←]

注意: macOS では、このディレクトリは標準で ~/Public/Drop Box という名前のディレクトリを用いる。名前に空白が含まれていることに注 意しなさい。このディレクトリの使い方は、次のページに書かれている。

coins では、このディレクトリ~/Public/Drop Box は、自動的には作 成されない。この練習問題では、このディレクトリを用いても良いし、他の名 前のディレクトリでもよい。

注意: この練習問題では、 インターネット上のファイル・サービス https://www.dropbox.com/ を用いない。

練習問題(3050) mkdirとchmodによる drop box ディレクトリの実装(2)

この drop box の使い方では、ファイル名として予測 可能なものを用いた場合、本来の受信者だけでなく、その他のユーザがファイ ルをアクセスすることも可能である。どのようにすれば、アクセスできるのか を説明しなさい。

他の人へのアクセスを防ぐ方法として、ファイル名に乱数(予測されない文字 列)を含める方法がある。この方法を練習してみなさい。

なお、cp コマンド等でコピーした場合には、ps コマンドで引数が表示される ことがある。このことを確認しなさい。ファイル名を秘匿してdrop box に書き 込む時には、ps で表示されない方法を使う必要がある。その方法を考えなさい。

練習問題(3051) ディレクトリのGIDの伝播

UIDとGIDの伝播を確認しなさい。 /tmp など、誰でも書き込みできる場所にファイルを作成すると、その ファイルの UID 属性はどうなるか調べなさい。新たに実験用のディレクトリを mkdir コマンドで作成しなさい。そのディレクトリのGID属性を chgrp で変更 し、その中に新たなファイルやディレクトリを作成したら、その GID がどう設 定されるかを確かめなさい。また、既存のファイルをmv コマンドで移動したら どうなるかを調べなさい。

◆シェル変数と環境変数

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

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

練習問題(3053) printenvコマンド

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

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

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

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

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

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

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

練習問題(3056) 環境変数 HOME

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

練習問題(3057) 環境変数 PATH

環境変数 PATH の働きを次のようにして調べなさい。
$ echo $PATH [←]
(表示を確認する)
$ aaaa [←]
-bash: aaaa: command not found     (エラーの表示)
$ ls [←]
(普通に実行される)
$ which ls [←]
/bin/ls
$ PATH=/usr/bin [←]
$ ls [←]
-bash: ls: command not found     (エラーの表示)
$ exit [←]
この例ではPATH の内容がかなり限定され、普段は実行できるコマンドが実行で きなくなっている。それで、最後に exit コマンドでシェルを終了している。 シェルが必要ならば、もう一度 iTerm を実行するなどしてシェルを実行する。

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

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ u=/Applications/Utilities [←]
$ echo $u [←]
/Applications/Utilities
$ ls $u [←]
Activity Monitor.app            Disk Utility.app
AirPort Utility.app             Grab.app
AppleScript Editor.app          Grapher.app
Audio MIDI Setup.app            Keychain Access.app
Bluetooth File Exchange.app     Migration Assistant.app
Boot Camp Assistant.app         System Information.app
BootPicker.app                  Terminal.app
ColorSync Utility.app           VoiceOver Utility.app
Console.app                     XQuartz.app
DigitalColor Meter.app
$ []

練習問題(3059) 「*」のエスケープ

「*」は、シェルが解釈するメタキャラクタの1つである。 ファイル名置換 で、ファイル名に置換られる。
$ echo * [←]
(ファイル名の並び)
$ ls -ld * [←]
(ls -ld の結果)
$ []
次のようにして、「*」をエスケープして、ファイル名置き換えの動作を無効化 できることを確認しなさい。
 $ echo \*[←]
 *
 $ ls -ld \*[←]
 ls: *: No such file or directory
 (「*」というファイルが存在しないというエラー・メッセージ。エラーが出ることが正しい動作。)
 $ echo '*'[←]
 *
 $ ls -ld '*'[←]
 ls: *: No such file or directory
 $ echo "*"[←]
 *
 $ ls -ld "*"[←]
 ls: *: No such file or directory
 $ []

練習問題(3060) 様々なシェルのメタキャラクタのエスケープ

練習問題 「*」のエスケープ と同様に、様々な メタキャラクタ を表示してみなさい。
$ echo '< > | { } ( ) [ ] & ; ^ " * ? ~'[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ echo "< > | { } ( ) [ ] & ; ^ ' * ? ~"[←]
< > | { } ( ) [ ] & ; ^ ' * ? ~
$ echo \< \> \| \{ \} \( \) \[ \] \& \; \^ \" \* \? \~[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ []

練習問題(3061) 変数とクォートの働き

bash で ダブルクォート「" "」 や シングルクォート 「' '」の働きを調べなさい。
$ echo "$HOME" [←]
(表示の確認)
$ echo '$HOME' [←]
(表示の確認)

練習問題(3062) historyコマンド

history コマンドで、どのようなコマンドを打ち込んできたかを調べなさい。
$ history [←]
$ history | tail -5 [←]
(過去の5行だけ表示)
$ history | grep cd [←]
(cd を含む行だけ表示)
$ history | lv [←]
(ページャ lv でページ単位で表示。)

練習問題(3063) historyを使ったコマンドの実行

history の結果を用いて、過去のコマンドを再実行してみないさい。

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

シェル変数 HISTFILESIZE の値を調べなさい。
$ echo $HISTFILESIZE [←]
history コマンドで表示されるコマンドの数を調べなさい。
$ history [←]
<表示>
$ history | wc [←]
$ []
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行 数である。 シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。

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

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

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

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

練習問題(3066) シェル変数と環境変数の比較

シェル変数と環境変数を比較しなさい。 練習問題 シェル変数の確認練習問題 printenvコマンド の結果を比較しなさい。変数を次の3つに分けて数を数えなさい。 シェル変数の方が数は多い。環境変数にしか現れないものは存在するか。
$ set | wc [←]
      53      67    1566
$ set | lv [←]
(表示省略。q で終了)
$ printenv | wc [←]
      24      29    1005
$ printenv | lv [←]
(表示省略。q で終了)
$ []

練習問題(3067) クォートと改行

ダブルクォート「" "」 や シングルクォート 「' '」は、中に改行を含めることができる。逆に言うと、必ず閉じる 必要がある。閉じられていない場合には、シェルのプロンプトが$ から > に変化する。このことを確認しなさい。
$ echo "a [←]
> b[←]
> c"[←]
(表示の確認)
$ echo 'a [←]
> b[←]
> c'[←]
(表示の確認)
$ []

練習問題(3068) ~/.bashrcの観察

自分のホーム・ディレクトリにある ~/.bashrc の内容を観察しなさい。
 $ cat ~/.bashrc[←]
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below
 $ []

◆シェル・スクリプト

練習問題(3069) 1行からなるシェル・スクリプトの作成

次の手順で 1 行からなるシェル・スクリプトを作成しなさい。

まず、端末で何かコマンドを実行しなさい。以下の例では、 /Applications/Calculator.app を実行している。

$ open /Applications/Calculator.app  [←]
(^p で1行もどす。^a で、行頭に移動して 「echo '」と打ち、^e して
「' >  run-calc」 と打つ)
$ echo 'open /Applications/Calculator.app'  > run-calc [←]
$ cat run-calc  [←]
open /Applications/Calculator.app
$ []
bash の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 echo には、実行したコマンドを 「'シングルクォート'」で括る( '|') などして、エスケープして与えると安全である。

作成したファイルは、そのまま実行できる。

$ bash run-calc  [←]

いちいち bash と打たないでもいいようにするために、chmod コマンド で実行可能属性をつける。

$ ls -l run-calc  [←]
-rw-r--r--  1 yas  prof  34  6 16 15:08 run-calc
$ chmod +x run-calc  [←]
$ ls -l run-calc  [←]
-rwxr-xr-x  1 yas  prof  34  6 16 15:08 run-calc
$ ./run-calc  [←]
$ ~/run-calc [←]
$ []
エディタ(Emacs)で1行目に「#!/bin/bash」か「#!/bin/sh」を入れる。
#!/bin/bash
open /Applications/Calculator.app 

完成したコマンドを ~/bin に移動する。

$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-calc ~/bin [←]
$ run-calc [←]
$ []

練習問題(3070) historyからのシェル・スクリプトの作成

複数行からなるシェル・スクリプトを作成しなさい。この場合、シェルにおけ る対話を保存するために echo コマンドではなく、history コ マンドを使う。
$ open /Applications/Firefox.app [←]
$ open /Applications/Thunderbird.app [←]
$ history [←]
(ヒストリの表示して、何行必要か数える。history コマンド自身の分、1行多く保存する。)
$ history |tail -4 > run-ft [←]
$ cat run-ft [←]
  512  open /Applications/Firefox.app
  513  open /Applications/MacPorts/Emacs.app
  514  history
$ emacs run-ft [←]
(不要な部分を削除する。1行目に #!/bin/bash と入れる。)
$ cat run-ft [←]
#!/bin/bash
open /Applications/Firefox.app
open /Applications/Thunderbird.app
$ ls -l run-ft [←]
-rw-r--r--  1 yas  prof  78  6 22 18:36 run-ft
$ cat run-ft [←]
#!/bin/bash
open /Applications/Firefox.app
open /Applications/Thunderbird.app
$ ls -l run-ft [←]
-rw-r--r--  1 yas  prof  78  6 22 18:36 run-ft
$ chmod +x run-ft [←]
$ ls -l run-ft [←]
-rwxr-xr-x  1 yas  prof  78  6 22 18:36 run-ft
$ ./run-ft [←]
$ ~/run-ft [←]
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-ft ~/bin [←]
$ run-ft [←]
$ []

練習問題(3071) fileコマンド

file コマンドは、ファイルの種類を推定して表示するコマンドである。ファイ ルの拡張子がなくても、画像や HTML 等を推定できる。
$ file .bashrc .emacs /bin/ls public_html/htdocs/index.html.en [←]
.bashrc:                          ASCII text
.emacs:                           Lisp/Scheme program text
/bin/ls:                          Mach-O 64-bit executable x86_64
public_html/htdocs/index.html.en: HTML document text
$ []

練習問題(3072) シェル・スクリプトの例

/usr/bin には、C 言語で記述したソース・プログラムをコンパイルして作成し たプログラムの他に、シェル・スクリプト(主に/bin/sh)も含まれている。どの ようなシェル・スクリプトがあるかを調べなさい。
$ cd /usr/bin [←]
$ file * | grep shell [←]
$ []

そのプログラムが、一般のプログラム(機械語)かシェル・スクリプトかは、 file コマンドを使うと調べることができる。

 $ cd /usr/bin[←]
 $ ls -l apropos[←]
 -r-xr-xr-x  1 root  wheel  1808  5 19  2009 apropos
 $ file apropos[←]
 apropos: POSIX shell script text executable
 $ head apropos[←]
 #!/bin/sh
 #
 # apropos -- search the whatis database for keywords.
 # whatis  -- idem, but match only commands (as whole words).
 #
 # Copyright (c) 1990, 1991, John W. Eaton.
 # Copyright (c) 1994-1999, Andries E. Brouwer.
 #
 # You may distribute under the terms of the GNU General Public
 # License as specified in the README file that comes with the man
 $ []

練習問題(3073) sortコマンド

sort コマンド は、データを並べ替えるプログラムである。データは、引数で指 定されたファイル、または、標準入力から受け取る。結果は、標準出力、また は、-o で指定されたファイルに書き出すプログラムである。

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

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

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

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

練習問題(3074) コマンド単体の復習

今日の課題では、シェル・スクリプトを作成するために今まで利用したコマンド を利用する。 次のようなコマンドの使い方を復習しなさい。

練習問題(3075) 数字だけを表示するdate

date は、日本語の環境では「年月日」などを含めて表示する。これを数字だけを表 示するようなシェル・スクリプト date-num を作成しなさい。
$ date [←]
2022年 4月15日 金曜日 12時12分46秒 JST
$ date-num [←]
2022-04-15
$ []
ヒント: man date と man strftime 参照。 date コマンドの + で、strftime の説明にある format string を指定する。

練習問題(3076) 世界の都市の時刻を表示するdate

自分が関心がある世界の2つ以上の都市を選びなさい。それらの都市の現在時刻 を表示するシェル・スクリプトを作成しなさい。
$ date-cities [←]
Asia/Tokyo
2022年 4月15日 金曜日 12時56分51秒 JST
Europe/London
2022年 4月15日 金曜日 04時56分51秒 BST
America/New_York
2022年 4月14日 木曜日 23時56分51秒 EDT
$ []

ヒント: date コマンドは、 環境変数の利用方法(TZ) で、表示を変化させる。

ヒント: 都市の情報は、/usr/share/zoneinfo/ にある。 夏時間(daylight saving time/summer time)により、 経度の標準からずれていることもある。

ヒント: 画面に都市名を表示するには、echo コマンドが使える。

練習問題(3077) ディレクトリの属性を表示するls -l

ls -l にディレクトリ名を与えるとその内容が表示される。-d オプションを付 けると、ディレクトリ自身の属性が表示されるが、しばしばこのオプションを 忘れてしまう。そこで、次のようなシェル・スクリプト lldir を作成して、ディ レクトリの属性を簡単に表示するようにしなさい。
$ lldir ~ [←]
drwxr-xr-x  59 yas  prof  12288  6 16 15:37 /home/prof/yas
$ lldir / [←]
drwxrwxr-t  27 root  admin  1326  4 22 15:43 /
$ []

練習問題(3078) platexを2回実行するシェル・スクリプト

platx コマンドは、参照を解決するためにしばしば2 回実行する必要がある。 それを簡単にするためのシェル・スクリプト l2 を作成しなさい。
$ l2 file [←]
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

練習問題(3079) platex、dvipdfmx、Preview.appの連続実行

platex コマンド、dvipdfmx コマンド、Preview.app (プレビュー.app) を次々と実行するシェル・スクリプトを作成しなさい。

$ lpshow file [←]
(画面には、file.pdf が Preview.app で表示される)
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。

練習問題(3080) 「.」から始まるファイルだけを表示するls

ls コマンドや bash の * では、「.」から始まるファイルは表示されない。逆 に「.」から始まるファイルだけを表示する ls コマンドを作りなさい。
$ ls-dot ~ [←]
.
..
.bashrc
.emacs
.login
$ []
ヒント

方法1:シェルの ファイル名置換でよく使われるパタン を利用し、「.*」というパタンで探す。

方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。

$ grep '^\.' [←]
abc[←]
.abc[←]
.abc
aaa[←]
.aaa[←]
.aaa
^D
$ []

余裕があれば、-l などのオプションが付けられるようにしなさい。

練習問題(3081) ディレクトリだけを表示するls

ディレクトリだけを表示する ls コマンドを作りなさい。
$ lsd ~ [←]
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$ []
方法1: ls -F の結果から grep で「/」がついているものだけを抜き出す。

余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。

練習問題(3082) ファイルの行数の順に表示するwc

wc コマンド は、ファイルの行数、単語数、バイト数を表示する。wc コマンド は、引数で与えられた順に表示する。これを行数の順に表示するようなスクリ プトを作りなさい。
$ wc-lines *.c [←]
      85     228    1836 proc-uid-print.c
      75     187    1156 pipe-rw-dup.c
      50     152    1141 vaddr-print.c
      46     140    1071 proc-create.c
      67     161    1014 pipe-rw-nodup.c
      38      93     819 signal-int.c
      50      98     802 setjmp-longjmp.c
      32      90     561 run-n.c
      27      66     535 home-print.c
      20      50     424 cont-1.c
      20      50     424 cont-0.c
      25      60     419 t-system.c
      20      40     384 exec-date.c
      14      49     370 arg-print.c
      15      44     355 env-print.c
      12      32     305 cont-2.c
      13      16     174 fork-hello.c
       4      10      60 main-return.c
$ []
この課題では、合計(Total)は表示されなくてもよい。

ヒント:wc の出力を sort コマンドでソートする。for で1つずつ wc コマン ドを実行して、全体の結果を sort するか、引数 $* で wc した後、sort する。

練習問題(3083) 使っているメモリのサイズが大きいプロセスの表示

ps aux では、全プロセス(a)が、サイズなどの情報も含めて(u)表示される。
$ ps aux [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root         1   0.0  0.0  2456708   1356   ??  Ss   火08AM    1:26.40 /sbin/la
yas       3549   0.0  0.0  2435468    980 s000  Ss    3:40PM   0:00.01 -bash
yas       3548   0.0  0.0  2450900    748   ??  S     3:40PM   0:00.00 /usr/sbi
yas       3546   0.0  0.0  2456124    672   ??  Ss    3:40PM   0:00.01 /sbin/la
root      3544   0.0  0.1  2450900   4700   ??  S     3:40PM   0:00.27 /usr/sbi
root      3543   0.0  0.0  2446148    820   ??  Ss    3:40PM   0:00.00 /usr/lib
...
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/lib
root      3556   0.0  0.0  2434788    428 s000  R+    3:40PM   0:00.00 ps aux
$ []
そのうち、メモリのサイズ(RSS)が大きいプロセスを 10 個だけ表示するシェル・ スクリプトを作りなさい。
$ ps-rss-top10 [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root       318   0.0  3.0   215076 127388   ??  Ss   火08AM    1:12.05 /Library/
root       104   0.0  0.9  2567852  37332   ??  Ss   火08AM    0:41.42 /System/L
_windowserver  1007   0.0  0.6  2775984  25560   ??  Ss   火05PM    0:31.43 /Sys
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/libe
root      1599   0.0  0.6 11156056  24040   ??  Ss   水02PM    0:09.13 /System/L
_mysql     218   0.0  0.5  2510832  18940   ??  S    火08AM    0:57.74 /opt/loca
_securityagent  1019   0.3  0.4  2757796  15396   ??  S    火05PM    7:51.89 /Sy
root       305   0.0  0.3   152008  14292   ??  S    火08AM    0:31.75 /Library/
root      1010   0.0  0.2  2727284   7956   ??  Ss   火05PM    0:03.56 /System/L
root      1050   0.0  0.2  2777952   7676   ??  Ss   火05PM    0:00.66 /System/L
$ []
ヒント:1行目は、そのまま表示する。RSS の順(第6フィールド)に sort して head する。

余裕があれば、VSZ の順、CPU 時間の順に表示するスクリプトを作りなさい。

類似のことを実行するプログラムとして top がある。

練習問題(3084) カウントダウン

引数で与えられた数を、秒単位でカウントダウンしていくシェルスクリプトを作りなさい。 (Python 等のスクリプト言語で作成するのは不可。)
$ ./countdown 3 [←]
3
2
1
0
$ []

練習問題(3085) バックアップ・ファイルとのdiff

emacs は、ファイルを保存する時に、1つの前のバージョンを「~」を 付けて保存する。そのようなファイルを見つけて、オリジナルのファイルと diff コマンドで比較するようなスクリプトを作りなさい。
$ diff-backup kadai10.txt [←]
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停 止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ い。

練習問題(3086) coins標準の bashrc の観察

自分のホーム・ディレクトリにある ~/.bashrc は、coins 標準のbashrc を「.」 コマンド (source コマン)ドで読み込んでいる。その読み込んでいる先のファ イルでどのような設定がなされているかを観察しなさい。
$ lv ~/.bashrc [←]
$ lv /usr/local/lib/standard/bashrc [←]
環境変数 PATHの値を観察しなさい。
$ echo $PATH [←]
環境変数 PATH に含まれているディレクトリには、どのようなコマンドがある かを調べなさい。例えば、/usr/local/bin を調べるには、次のようにする。
$ ls /usr/local/bin [←]
PATH 以外にどのような シェル変数と環境変数 が設定されているかを調べなさい。
$ set [←]
(全てのシェル変数と環境変数の表示)
$ set | lv [←]
(全てのシェル変数と環境変数の表示。lv によるページ単位の表示。)
$ printenv [←]
(環境変数の表示)
$ printenv | lv [←]
(環境変数の表示。lv によるページ単位の表示。)
$ []

練習問題(3087) ~/.bashrcでのシェル変数の登録

シェルに対してよく打ち込む長い文字列を、~/.bashrc で シェル変数に設定 してみなさい。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、端末のウィンドウが開かなくなる、 ssh で遠隔ログインができなくなる 等の問題が生 じることがある。(端末プログラムがウィンドウを開いても、すぐに bash が終了するので、 ウィンドウを閉じてしまう、ssh で遠隔ログインしても、すぐにログアウトしてしまう ことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

練習問題(3088) エイリアス ll の定義

以下の例を真似て、bash の alias 機能を用いてls -l の代わりに ll というコマンドを使えるようにしなさい。

$ ls -l [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ ll [←]
-bash: ll: command not found
          # この時点ではコマンドは見つからない
$ alias ll='ls -l' [←]
          # alias による ll コマンドの定義
$ ll [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ []

練習問題(3089) bash alias 関連のコマンド

bash の alias 関連のコマンドを利用してみなさい。
一覧表示
alias コマンドを引数なしで実行する。例:
$ alias [←]
単独表示
alias コマンドに名前を引数として与える。例:
$ alias ll [←]
定義
alias コマンドに「名前='定義内容'」 を引数として与える。例:
$ alias ll='ls -l' [←]
削除
unalias コマンドに名前を引数として与える。例:
$ unalias ll [←]

練習問題(3090) bashのエイリアスの~/.bashrcへの登録

bash の alias は、定義したシェルでのみ有効である。 全部のシェルで有効にするためには、 ~/.bashrc に登録する必要がある。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、端末のウィンドウが開かなくなる、 ssh で遠隔ログインができなくなる 等の問題が生 じることがある。(端末プログラムがウィンドウを開いても、すぐに bash が終了するので、 ウィンドウを閉じてしまう、ssh で遠隔ログインしても、すぐにログアウトしてしまう ことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

 $ cat ~/.bashrc
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below

 alias ll='ls -l'
          # ~/.bashrc に ll を追加した
 $ ll[←]
 bash: ll: command not found
          # 追加しただけでは、コマンドは見つからない
 $ . ~/.bashrc[←]
          # 「.」コマンドで、~/.bashrc を読み込む
 $ ll
 (ls -l の表示)
          # ll コマンドが有効になっている。
 $ []

練習問題(3091) 1行からなるエイリアスの定義

1行からなるシェル・スクリプトと同様に、1行からなるエイリアスを定義しなさい。

練習問題(3092) LANGを変更するalias

環境変数LANGを次のものに変更するようなalias を定義しなさい。 手引き 2.7.2 参照。 ページャ lv には、検索機能がある。 にあるキーの動きを確かめなさい。

練習問題(3094) ls -Rコマンド

ls コマンドには、-R (大文字 R, Recursive) というコマンドがあり、 引数で指定されたディレクトリに子供のディレクトリが含まれていたら、 その子供についても表示する(子供にも子供があればそれも表示する)。 この動きを確かめなさい。
$ cd ~ [←]
$ ls -R    . | lv [←]
$ ls -lR   . | lv [←]
$ ls -laR  . | lv [←]
-R オプションは、このようにしばしば-l オプションや -a オプションと一緒に使われる。また、-R オプションは、大 量の結果を表示することが多いので、パイプに出力してページャで表示するこ とが多い。 (これらのオプションを忘れた人は、man コマンドを見なさい。)

練習問題(3095) treeコマンド

treeコマンド を利用してみなさい。

練習問題(3096) シンボリック・リンクの調査

ls -l を使って、次のディレクトリにどのようなシンボリック・リンクがある かを調べなさい。 ls コマンドと grep コマンドを組み合わせて使うと便利である。
$ ls -l /Applications | grep '^l' [←]
ここで、'^l' は、 行の先頭がl で始 まるという意味である。 。

練習問題(3097) cp -rコマンド

cp -r の動作について調べなさい。 実際に実行して動作を確認しなさい。

練習問題(3098) scp -rコマンド

scp の -r オプションの動作について調べなさい。 実際に実行して動作を確認しなさい。 シンボリック・リンクをどのように扱うか試してみなさい。

練習問題(3099) tarコマンドによるファイルのコピー

tar コマンドを用いて、ファイルをコピーしなさい。 シンボリック・リンクをどのように扱うか試してみなさい。 ssh と組み合わせることで、異なるコンピュータ間でファイルをコピーできることを確認しなさい。 。

練習問題(3100) Finder によるエイリアスの作成

Finder で ファイルに対するエイリアスを作成してみなさい。

練習問題(3101) Emacs Dired によるディレクトリ木の表示

Emacs に含まれている Directory Editor を利用して ディレクトリ木を表示しなさい。 テキストファイルを開いたり、削除したり、改名したりしなさい。 。

練習問題(3102) lynx,w3m コマンドによるディレクトリ木の表示

lynx や w3m のように、端末で動作する Web ブラウザを利用してディレクトリ 木を表示しなさい。
$ lynx . [←]
$ lynx ~ [←]
$ w3m . [←]
$ w3m ~ [←]

◆ファイルの整理

練習問題(3103) du コマンド

du コマンドを利用してみなさい。 引数に調べたいディレクトリ名を与える。ディレクトリ名としては、「.」や 「~」も可であるが、ファイルの数が多い時に表示までに時間がかかる。途中で やめたくなった時には、 ^C (Control+C) で強制終了する。
$ du ~/Desktop [←]
$ du ~/Documents [←]
$ du ~/Downloads [←]
$ du ~/Library/Caches [←]

練習問題(3104) du コマンドのオプション

du コマンドのオプションの動きを確認しなさい。 sort コマンドや head コマンドと組み合わせて使ってみなさい。 du コマンドの説明を参照。

$ ls -d D* [←]
Desktop		Documents	Downloads
$ du -s D* [←]
155115	Desktop
43227	Documents
144962	Downloads
$ du -s -h D* [←]
 76M Desktop
 21M Documents
 71M Downloads
$ du -s -k D* [←]
77558	Desktop
21614	Documents
72481	Downloads
$ []

練習問題(3105) Webブラウザのキャッシュの観察

cd, ls, lv コマンドなどを利用して Web ブラウザのキャッシュが保存されて いるファイルを観察しなさい。MacOSX Firefox では次のディレクトリの下にあ る。
$ cd ~/Library/Caches/Firefox/Profiles/*/cache2/entries [←]
$ ls -l [←]
$ file * [←]
$ du -h [←]
file コマンド は、ファイルの種類を推定して表示するコマンドである。ファイルの拡張子が なくても、画像や HTML 等を推定できる。 du コマンド は、ディスクの使用量(disk usage)を表示するコマンドである。 手引き 2.8.2 参照手引き 10.10 参照

実行例

$ cd ~/Library/Caches/Firefox/Profiles/*/cache2/entries [←]
$ file * [←]
006309EAFFD4653F45B69F09BF6F930B6C5B394C: HTML document text
010373204138EBE73E75A5935139FBE5159574DA: PNG image data, 471 x 170, 8-bit colormap, non-interlaced
01411C7B7D29B77239ADD6E1444AF735CF58EDAA: data
01B0B8F5A4CF26E30ABE4F537A04FDD2A769E1E3: data
02071B585FF428DA83F1E4771B34B0448CE22DB9: data
024B2D783D20A9528AFF7608FBBC242F09A56F7C: data
0298A6896A40F67AB5A8A2BC7CF8A2A686AF7797: gzip compressed data, from Unix
02A6CF51FEFDBB859AF2B3ABBCFF533F4B56FF75: gzip compressed data, from Unix, max speed
03868AAF0B3AF200ED91951DD663C59643712DF3: GIF image data, version 89a, 1 x 1
041D89FF5E95B5856742F2D33817E0F50850DED0: gzip compressed data, from Unix
....
$ []

その他の Web ブラウザについては、次のディレクトリ、その子供、親、兄弟の ディレクトリを観察してみなさい。

練習問題(3106) Firefox Webブラウザのキャッシュの設定

自分が使っている Web ブラウザで、次のことを調べなさい。 手引き 10.10 参照

練習問題(3107) その他の Webブラウザのキャッシュの削除

Web ブラウザのキャッシュを削除してみなさい。削除方法は、次の資料を参照 しなさい。 ここには、次の3つのブラウザについて、削除方法が記載されている。

練習問題(3108) MacOSXのアプリケーションのキャッシュの観察と削除

次のような方法で、 MacOSXのアプリケーションのキャッシュ の様子を観察しなさい。
$ ls ~/Library/Caches [←]
$ ls -l ~/Library/Caches [←]
$ ls -lR ~/Library/Caches [←]
$ du ~/Library/Caches [←]
$ du -s ~/Library/Caches/* [←]
$ du -sh ~/Library/Caches/* [←]
不用ならば、削除しなさい。アプリケーションが動作していない時に削除する ことが望ましい。
$ ls ~/Library/Caches [←]
$ rm -r ~/Library/Caches [←]

練習問題(3109) quotaコマンド

quotaコマンド を実行して、自分が保持しているファイルが、ディスク上でどの程度の領域を 占めているのか(1K blocks の下)を調べなさい。また、上限(quota limit) が いくつかを調べなさい。

$ quota [←]
$ quota -v [←]

この結果と、 du コマンド の結果を比較しなさい。

$ du -s -k ~ [←]
(表示までに時間がかかる。強制終了したければ、^C)

練習問題(3110) .DS_Store

MacOSX では、「.DS_Store)」や「._.DS_Store」というファイ ルが作られることがある。これは、Finder がアイコンの位置等を保持するため のファイルである。このファイルは、ls コマンドでは表示されないが、次のよ うに -a オプションを使ったり、「*」を使うと表示される。
$ ls -a [←]
.
..
(中略)
.DS_Store
(中略)
._.DS_Store
(中略)
$ ls .*DS* [←]
.DS_Store	._.DS_Store
$ ls -l .*DS* [←]
-rw-r--r--@ 1 yas  prof  24580  6 17 11:44 .DS_Store
-rw-r--r--  1 yas  prof   4096  3 14  2014 ._.DS_Store
$ ls -l ~/Desktop/.*DS* [←]
-rw-r--r--@ 1 yas  prof  12292  4 25 17:07 /home/prof/yas/Desktop/.DS_Store
-rw-r--r--  1 yas  prof   4096  4  7  2014 /home/prof/yas/Desktop/._.DS_Store
$ []
これを観察してみなさい。rmdir でディレクトリを削除する時に、このファイ ルが邪魔をして削除できないことがある。この時には、このファイルを削除し なさい。
$ ls .*DS* [←]
.DS_Store	._.DS_Store
$ rm .*DS* [←]
$ []

練習問題(3111) 「._」から始まるファイル名

MacOSX では、「._」が始まるファイル名のファイルが作られることが ある。これは、他の Unix にはない、MacOSX 独自の ファイルの属性 (メタデータ)を表すものである。独自の属性としては、ファイルを作成した時 刻や作成したプログラムがある。
$ ls ._* [←]
._.DS_Store			._audio-sampling.png
._Desktop			._fj-meetings-coins.eml
._Library			._shinjo-picture-2022-05-10.jpeg
._audio-sampling-2.png
$ []

これを観察してみなさい。rmdir でディレクトリを削除する時に、このファイ ルが邪魔をして削除できないことがある。この時には、このファイルを削除し なさい。

$ ls ._* [←]
(表示して確認)
$ rm ls ._* [←]
$ []

◆Emacs(2) 複数ファイルの扱い

練習問題(3112) Emacsの復習

Emacs で、ファイルを作成する方法を復習しなさい。

方法1: 引数にファイル名を与える方法。

方法2: 実行後にファイル名を与える方法

練習問題(3113) Emacs emacs、タブキーによる補完機能

練習問題 emacs、タブキーによる補完機能 を行いなさい。

練習問題(3114) Emacs 他のファイルへの保存

Emacs で別のファイルへ保存する機能を練習しなさい。

練習問題(3115) Emacs、カットの復習

Emacsの カット&ペースト、コピー&ペースト の機能を用いて、カット機能を使って大量のテキストを削除してみなさい。 この機能は、次のような時に有用である。 カットの練習をする時には、まずファイルをコピーする必要がある。 ファイルをコピーするには、次のような方法がある。 Emacs でカットを行うには、次のようにする。
  1. 削除したいテキストの先頭にカーソルを移動させる。
  2. C-SPC、または、C-@ でマークを設定する。
  3. 削除したいテキストの末尾にカーソルを移動させる。
  4. C-wでカットする。
macOS で C-SPC でマークを設定したいのに、できない場合には、 「システム環境設定>キーボード>ショートカット」で Spotlight や入力ソースの切り替えに割当てられている ショートカット・キーを変更したり解除すると良い。

練習問題(3116) Emacs でコピー&ペーストで用いるキー

Emacs で、次のキー操作の動作を調べなさい。
キー 説明
C-SPC または C-@ コピーする領域の先頭を決める(マークを設定する)
C-w マークした部分とカーソルの間の領域をカットする
Esc w または M-w マークした部分とカーソルの間の領域をコピーする
C-y コピー、または、カットしたものをペーストする

練習問題(3117) Emacs でのコピー&ペースト

、 , 手引き 3.3.5項 参照。 Emacs で、キー操作よるコピー&ペーストの練習をしなさい。
  1. 内容を壊してもよいテキストファイルを作成する。 たとえば、以前に提出したレポートを、cp コマンドでコピーする。
  2. Emacs を実行する。
  3. C-x C-f で、1.のファイルを開く。
  4. コピーしたい部分の先頭にカーソルを移動する。 カーソル移動キーC-f,C-b,C-n,C-pの他に、 文字単位の移動の他に、ページ単位の移動 C-v,M-v,Esc vも有用である。
  5. C-SPC または C-@ で、マークを設定する。 もし、C-SPC がうまく動かない時には、 Spotlight のショートカット・キーの解除 を行う。
  6. カーソルを、コピーしたい部分の末尾に移動する。
  7. M-w または Esc w でコピーする。
  8. カーソルを、ペーストしたい部分に移動する。
  9. C-y でペーストする。
同様に、次の操作を確認しなさい。

練習問題(3118) Emacs で複数のウインドウとバッファの操作

Emacs で、次のキー操作の動作を調べなさい。
キー 説明
C-x 2 ウインドウを2つに分割(現在のバッファを複数ウインドウで表示)
C-x 1 ウインドウを1つにする(他のウインドウを閉じる)
C-x 0 現在のウインドウを閉じる
C-x o 他の(other)ウインドウにカーソルを移動。
C-x C-b バッファのリストを表示
C-x b 別のバッファを表示する
手引き 3.5.1項 参照

練習問題(3119) Emacs で長いファイルの編集

Emacs のウインドウを開く機能(C-x 2)は、1画面に入らないような大 きなファイルを部分的に表示する時に有用である。このことを確認しなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. カーソル移動のキーで、表示したい部分を表示する。 文字単位の移動の他に、ページ単位の移動も有用である。
  4. C-x 2 で、ウインドウを2つに分割する。
  5. C-x o で、カーソルをもう1つのウインドウに移動
  6. カーソル移動のキーで、別の表示したい部分を表示する。
  7. 以後、C-x o で、カーソル行き来しながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  8. C-x C-s で、ファイルを保存
  9. C-x C-c で、Emacs を終了する

練習問題(3120) Emacs で複数のファイルの編集/2つのウインドウ

次の手順で、Emacs で複数のファイルを同時に編集してみなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. C-x 2 で、ウインドウを2つに分割する。
  4. C-x o で、カーソルをもう1つのウインドウに移動
  5. C-x C-f で、ファイルを開く
  6. 以後、C-x o で、カーソル行き来しながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  7. C-x C-s で、ファイルを保存
  8. C-x o で、カーソルをもう1つのウインドウに移動
  9. C-x C-s で、ファイルを保存
  10. C-x C-c で、Emacs を終了する

練習問題(3121) Emacs で複数のファイルの編集/見えないウインドウ

次の手順で、Emacs で複数のファイルを同時に編集してみなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. C-x C-f で、ファイルを開く
  4. 以後、C-x b で、バッファを切り替える。 補完機能が使える。タブキーを押すと、バッファの一覧が表示される。
  5. 以後、 C-x b で、バッファを切り替えながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  6. C-x C-s で、ファイルを保存
  7. C-x b で、カーソルをもう1つのウインドウに移動
  8. C-x C-s で、ファイルを保存
  9. C-x C-c で、Emacs を終了する
手引き 3.3.7 参照。 Emacs のインクリメンタルサーチ機能を使ってみなさい。 C-s (上から下方向の検索)の代わりに、C-r (下から上方向の検索)を利用してみなさい。 インクリメンタル・サーチとカーソル移動(矢印キー、C-v, M-v)とを比較して、 インクリメンタル・サーチの利点を考えなさい。 Emacs で非インクリメンタルな検索機能を使ってみなさい。

練習問題(3125) Emacs query-replace

Emacs で query-replace を利用してみなさい。
  1. 練習用に、内容が破壊されても問題ないファイルを用意する。 たとえば、過去に提出したレポートを cp コマンドでコピーする。
  2. そのファイルを emacs 開く
  3. M-% (Esc %)と打つ
  4. 以後、Emacsの検索と文字列の置換え参照。

練習問題(3126) Emacs query-replace

次のテキストを Emacs のバッファにコピーしなさい。

GNU Emacs is a version of Emacs, written by the author of the original
(PDP-10) Emacs, Richard Stallman.  The primary documentation of GNU
Emacs is in the GNU Emacs Manual, which you can read on line using
Info, a subsystem of Emacs.  Please look there for complete and
up-to-date documentation.  This man page is updated only when someone
volunteers to do so; the Emacs maintainers' priority goal is to
minimize the amount of time this man page takes away from other more
useful projects.  The user functionality of GNU Emacs encompasses
everything other Emacs editors do, and it is easily extensible since
its editing commands are written in Lisp.
Emacs の query-replace の機能を 使って、上の文書の「Emacs」の部分を自分の学籍番号に変えなさい。

練習問題(3127) a: grep、egrepとパイプ

正規表現の検索機能を用いて、次のファイルやコマンドの出力から 目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。 なお、grepコマンドで OR の機能が必要ならば、-e オプションを複数与える方 法がある。egrep コマンドの「|」を用いれば 1 回で終わることもある。 レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略しなさい。アクセス・ログに自分のページへのアク セスがない場合には、Web ブラウザでアクセスしてログに含ませなさい。

◆Webページの作成、アクセスログ、Webページに対するアクセス制御

練習問題(3128) WebブラウザーでのHTMLの観察

この課題の前に、 マウスの設定 がなされており、 「副ボタン」(右ボタン)が設定されていることを確認しなさい。

Firefoxブラウザを操作して、 元の HTML (ソース)を表示 しなさい。

  1. HTML を表示したいページを Firefox で普通に表示する
  2. 表示されたページで、何も表示されていない部分(白い部分)にマウスの ポインタを移動して、マウスの主ボタン(左ボタン)でクリックする。(何か選 択している状態だったらこれで解除される。)
  3. マウスの副ボタン(右ボタン)でコンテキスト・メニューを表示する。 Mac では、マウスの右ボタンの代わりに、コントロール・キーを押しながらボ タンを押すことでもよい。
  4. コンテキスト・メニューから「ページのソースを表示」を選ぶ。
コンテキスト・メニューを使うかわりに、「Command+u」 (Command+u)を押す方法もある。

Firefoxのコンテキスト・メニュー、ページのソースを表示。 (クリックで拡大)

練習問題(3129) lsコマンドによるディレクトリとファイルの属性の表示

ls -l により、ディレクトリとファイルの属性を表示しなさい。 必要に応じて lsの-dオプションによるディレクトリそのものの表示 を行いなさい。 (ls コマンドに -ld (-dl, -l -dでも可)オプションを付けなさい。)
$ ls -l literacy-a2.txt [←]
(1つのファイルの属性の表示)
$ ls -l literacy-a*.txt [←]
(複数のファイルの属性の表示)
$ ls -ld ~ [←]
(ホーム・ディレクトリの属性の表示)
$ cd [←]
(ホーム・ディレクトリへ移動)
$ ls -ld  [←]
(カレントワーキングディレクトリ==ホーム・ディレクトの属性の表示)

ファイルの属性 を参考にして、ls -l の結果を、解釈しなさい。今日の実習では特に 次の属性について着目しなさい。

r	読込み可
w	書込み可
x	実行可(ディレクトリの場合は探索可)

練習問題(3130) Webページ用のディレクトリ作成

筑波大学情報学類コンピューティング環境では、 http: と https: で異なる Web ページの内容を公開できるようになっている。 http: の場合、個人の Web ページは、次のような URL で参照される。

ここで「ユーザ名」を、ログインの時に打つ自分のユーザ名 で置き換える。たとえば、学籍番号が 202054321 の人は、次のような URL で 参照される。 この URL は、次のディレクトリに対応する。 このディレクトリを、mkdir コマンドで作成しなさい。
$ mkdir ~/public_html [←]
$ mkdir ~/public_html/htdocs [←]
作成したディレクトリのその他(others)に対するアクセス許可で x ビットが立っ ていることを確認しなさい。
$ ls -ld ~/public_html [←]
drwxr-xr-x  5 yas  prof  4096  4 10 13:46 /home/prof/yas/public_html
         ^ここ

$ ls -ld ~/public_html/htdocs [←]
drwxr-xr-x  35 yas  prof  5120  4 10 13:49 /home/prof/yas/public_html/htdocs
         ^ここ
さらに、ホーム・ディレクトリにもその他(others)に対するアクセス許可で x ビットが立っていることを確認しなさい。
$ ls -ld ~ [←]
drwxr-xr-x  53 yas  prof  7168  5 15 15:25 /home/prof/yas
$ []
         ^ここ

x ビットがたっていない場合には、 ディレクトリのxの働き を理解し、 chmod コマンド で修正しなさい。

https: の場合、個人の Web ページは、次のような URL で参照される。

この URL は、次のディレクトリに対応する。

練習問題(3131) 単純なテキスト・ファイルの公開

注意:この練習問題は、練習問題 (3130)WWW ページ用のディレクトリ作成の後に行いなさい。

ディレクトリ ~/public_html/htdocs/ の下に、単純なテキスト・ファイル (HTMLではない)を Emacs 等で作成して置きなさい。ファイル名の拡張子は、 「.text」または「.txt」としなさい。

作成したファイルのモードを調べなさい。file1.textという 名前のテキスト・ファイルを作成した場合、次のようにその他(others)に対す るアクセス許可で r ビットが立っていることを確認しなさい。

$ cd ~/public_html/htdocs [←]
$ emacs file1.text [←]
(何か簡単な内容を打ち込み、保存して終了する。)
$ ls -l file1.text [←]
-rw-r--r--   1 yas  prof  2 May 22 22:09 file1.text
$ []
       ^ここ
作成したファイルを Web ブラウザで表示しなさい。たとえば、 file1.textという名前のテキスト・ファイルを作成した場合、 次のような URL で参照する。

ユーザ名」を、ログインの時に打つ自分のユーザ名で置き 換えなさい。たとえば、学籍番号が 202054321 の人は、次のような URL を開 きなさい。

HTTP で始まる URL には、public_html/htdocs は含まれないことに注 意しなさい。

練習問題(3132) サンプルのコピー

注意:この練習問題は、練習問題 (3130)WWW ページ用のディレクトリ作成の後に行いなさい。

次の HTML ファイルを、ディレクトリ ~/public_html/htdocs の下にコピー し、それを Web ブラウザ表示しなさい。

$ cd ~/public_html/htdocs [←]
$ ls [←]
(sample1.htmlが存在しないことを確認する。)
$ cp ~yas/public_html/htdocs/coins/literacy-2018/samples/sample1.html . [←]
$ ls -l sample1.html [←]
-rw-r--r--  1 yas  prof  525  5 14 16:19 sample1.html
$ []
最後のカレント・ワーキング・ディレクトリの意味の「.」を忘れないこと。 ls -l の結果、その他(others)に対するアクセス許可で r ビットが立っている ことを確認しなさい。

コピーした後、Web ブラウザで次の URL を開きなさい。

ユーザ名」を、ログインの時に打つ自分のユーザ名で置き 換えなさい。たとえば、学籍番号が 202054321 の人は、次のような URL を開 きなさい。

HTTP で始まる URL には、public_html/htdocs は含まれないことに注 意しなさい。

練習問題(3133) 個人のホーム・ページの作成

個人のホーム・ページを作成しなさい)。 各自のホーム・ページは、次の HTML ファイルに対応する。

作成したホーム・ページを、Web ブラウザで開きなさい。 Web ブラウザで次の URL を開きなさい。

練習問題(3134) ディレクトリを指定した時のWebページの内容

URL でディレクトリを指定すると、自動的にそのディレクトリにある 「index.html」という名前のファイルが使われる。この機能を使うと、 各自のホーム・ページは、次のように短く表示できる。

この事を確認しなさい。また、ホーム・ページ以外のディレクトリについても、 この機能が有効なことを確認しなさい。

練習問題(3135) Web サーバ上のデータの観察

次の手順で、Web サーバ上のデータの観察のアクセスログを観察しなさい。

練習問題(3136) アクセスログの観察

情報科学類のWebサーバの Web アクセスログは、Webサーバ(www,www.coins.tsukuba.ac.jp)上の /var/log/httpd/access* というファイルにためられる。 これを、次のコマンドを利用しながら観察しなさい。 具体的な方法を以下に示す。
  1. 練習問題 Web サーバ上のデータの観察 と同様に、ssh コマンドで www.coins.tsukuba.ac.jp にログインする。 遠隔ログイン前後で、プロンプトの変化に注意すること。
  2. cd コマンドで、ログがあるディレクトリに移動する。 (hostname の結果が viola5 でない時には、 ssh コマンドで www.coins.tsukuba.ac.jp にログインすること。)
    $ hostname [←]
    viola5
    $ cd /var/log/httpd/ [←]
    $ pwd [←]
    /var/log/httpd
    $ []
    
  3. このディレクトリで、ls コマンドを実行しなさい。以下の例で、 access* の「*」は、 シェルの ファイル名置換 の意味である。
    $ ls [←]
    (多くのファイルが表示される)
    $ ls access* [←]
    (まだ多くのファイルが表示される)
    $ ls access*    | tail -1 [←]
    access_log_20210609
    $ ls -t access* | head -1 [←]
    access_log_20210609
    $ []
    
    この例では、access_log_20210609 が最新のものである。
  4. このファイルを lv コマンドで表示しなさい(スペースキー、bキー、qキーで操作)。
    $ lv access上のlsの結果で置き換える [←]
    
    たとえば、上の例では、次のように打つ。
    $ lv access_log_20210609 [←]
    
  5. このファイルを、tail コマンドで表示しなさい。
    $ tail access上のlsの結果で置き換える [←]
    (表示がなされる。)
    (しばらく待つ。)
    $ tail access上のlsの結果で置き換える [←]
    (表示がなされる。)
    (しばらく待つ。)
    $ tail access上のlsの結果で置き換える [←]
    (表示がなされる。)
    $ []
    
    (しばらく間隔を空けてから)数回 tail コマンドを実行すると、その度に行 が増えているはずである。 たとえば、上の例では、次のように打つ。
    $ tail access_log_20210609 [←]
    $ tail access_log_20210609 [←]
    $ tail access_log_20210609 [←]
    $ []
    
Webサーバ・アクセスログ を参考にして、アクセスログの意味を解釈しなさい。

練習問題(3137) 学類 Web サーバのアクセス・ログの観察(grep)

自分自身で、情報科学類の Web ページをアクセスした時に、自分が使っている iMac の IP アドレスが表示されることを確認しなさい。

  1. まず、Web ブラウザを実行しているコンピュータの の IP アドレスを調べなさい。 自宅のコンピュータでは、NAT (Network Address Translation) の仕組みが動作している ことがある。この場合は、 この講義の 「https://www.coins.tsukuba.ac.jp/~syspro/2022/report/present.cgi,出席ボタン」 を押すと、そこに表示されるので、それを利用する方法がある。 (出席ボタンは、何度押しても問題がない。授業時間外に押しても問題はない。 最終的に、授業時間内のものだけ集計される。 授業を履修していなくても、出席ボタンを押しても良い。 )
  2. 次のように grep コマンドを使って、IP アドレスを検索しなさい。
    $ grep IPアドレス アクセスログのファイル名 [←]
    
    たとえば、IP アドレスが 2001:2f8:3a:1711::230:30 であれば、次のように打つ。
    $ grep 2001:2f8:3a:1711::230:30 アクセスログのファイル名 [←]
    
    たとえば、IP アドレスが 130.158.230.30 であれば、次のように打つ。
    $ grep 130.158.230.30 アクセスログのファイル名 [←]
    
    ここで「アクセスログのファイル名」は、 練習問題 アクセスログの観察 で調べなさい。 たとえば、その練習問題の例では、次のように打つ。
    $ grep 2001:2f8:3a:1711::230:30 access_log_20210609 [←]
    
もし、何も現れなければ、 http: でこの講義の Web ページ http://www.coins.tsukuba.ac.jp/~syspro/2022/ をアクセスした後で、アクセスログを検索してみなさい。 あるいは、https: によるアクセスログ ssl_access* を対象として この練習問題、および、以下の練習問題を行っても良い。 練習問題 学類 Web サーバのアクセス・ログの観察(https) 参照。

練習問題(3138) 学類 Web サーバのアクセス・ログの観察(tail-f)

ログのファイルを tail -f で表示してみなさい。
$ tail -f アクセスログのファイル名 [←]
ここで「アクセスログのファイル名」は、 練習問題 学類 Web サーバのアクセス・ログの観察 で調べなさい。 たとえば、その練習問題の例では、次のように打つ。
$ tail -f access_log_20210609 [←]
-f オプションを指定すると、tail コマンドは終了することなく新しく追加さ れた行を表示する。この tail コマンドは、自動的には終了しないので、終わっ たら、 ^C (Control+C) で強制終了させる。

練習問題(3139) 学類 Web サーバのアクセス・ログの観察(https)

情報科学類では、2つの World Wide Web のサーバを実行している。 練習問題(3136) では、SSL を用いていない学類 Web サー バ (http:のもの) のアクセス・ログの観察していた。それと同様に、と同様に、 SSL を用いているサーバ (https: のもの)について、アクセスログを観察しな さい。

練習問題(3140) .htaccessによるShibboleth認証の利用

~/secure_html/ の下に、実験用のディレクトリを作成しなさい。
$ mkdir ~/public_html/secure_htdocs [←]
$ mkdir ~/public_html/secure_htdocs/ディレクトリ名 [←]
次のドキュメントを参考にして、作成したディレクトリに .htaccess を作成し、 利用してみなさい。

練習問題(3141) .htaccessによるBasic認証のページ(htpasswd)

htpasswd コマンドを使ってパスワード・ファイルを作成しなさい。作成したパ スワード・ファイルを利用して、 Basic 認証 によりアクセス制御を行うように設定しなさい。 。

例:パスワード・ファイル /home1/prof/yas/etc/passwd-doc1 に登録されているユーザだけが、 .htaccess があるディレクトリ以下にあるファイルをアクセスできる。

.htaccess:

AuthType Basic
AuthName "Staff Only"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user
このパスワード・ファイルは、サーバ上でhtpasswd というプログラムで作成する。
$ htpasswd -c /home1/prof/yas/etc/passwd-doc1 user1 [←]
Adding password for user1.
New password:user1のパスワードを打ち込む[←]
Re-type new password:user1のパスワードを打ち込む[←]
$ htpasswd /home1/prof/yas/etc/passwd-doc1 user2 [←]
Adding user user2
New password:user2のパスワードを打ち込む[←]
Re-type new password:user2のパスワードを打ち込む[←]
$ []
一番最初は、-c オプション付で実行する。passwd コマ ンドと同様に、打ち込んだパスワードは、画面には表示されず、また、確 認のために2回打つ必要がある。

htpasswd コマンドの結果、次のようなファイルが作られる。

user1:1fjr1tHIgoG7U
user2:qXaeA9Zge7Yqc
ユーザ名と暗号化されたパスワード(正確にはパスワードのハッシュ値)から 構成される。

パスワードによるアクセス制御の例: 設定ファイル .htaccess

AuthType Basic
AuthName "Staff Only"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user

練習問題(3142) .htaccessによるBasic認証のページ(dbmmanage)

htpasswd コマンドの代わりに dbmmanage コマンドを使い、パスワード・ファ イルを作成しなさい。作成したパスワード・ファイルを利用して、Basic 認証 によりアクセス制御を行うように設定しなさい。

練習問題(3143) WWWページに対するIPアドレスによるアクセス制御

特定のIPアドレスのコンピュータからしか表示できないような WWW ページを作 成しなさい。逆に、特定のIPアドレスのコンピュータからは表示できないよう な WWW ページを作成しなさい。

◆Coins のメール

練習問題(3144) @coins.tsukuba.ac.jp のメール

情報科学類のコンピュータにアカウントを作成した人は、 次のメールアドレスが使えるようになっている。 coins では新たにメールアドレスを作成する手続きは必要はない。 情報科学類コンピューティング環境/mail環境 参照。

次のようなことを行ってみなさい。
  1. 全学やその他のメール・アカウントから Coins の自分のアドレスにメー ルを送信する。
  2. 1. で送ったメールを読む。
  3. 1. で送ったメールに対して返信する。
  4. 3. の返信を読む。この時、From: が正しいものか、From に display name が設定されているか確認する。

練習問題(3145) Maildir

coins では各自が受信したメールを、各自のホームディレクト以下の ~/Maildir/ の下に保存する。その様子を ls コマンドや cat コマンドで観察しなさい。
$ ls ~/Maildir/ [←]
$ ls -a ~/Maildir/ [←]
$ ls ~/Maildir/cur [←]
$ ls ~/Maildir/new [←]
$ ls ~/Maildir/tmp [←]
$ cat ~/Maildir/cur/ファイル名 [←]
このようなディレクトリの形式を Maildir 形式や Maildir++ 形式という。

注意: ~/Maildir/ 以下には、IMAP サーバが利用する重要なファイルも ある。削除したり壊さないように、慎重に操作すること。

練習問題(3146) .forwardの設定と確認

この練習問題をする前に、必ず ~/.forwardによる電子メールの転送 を読み、働きと危険性を理解しなさい。失敗すると、電子メールが失われたり、 メールサーバに過大の負荷をかけることになる。

coins 以外に日常的に読み書きするメール・アカウントがある人は、毎日 coins に届いたメールを確認する方法として~/.forward を設定して、転送する 方法が考えられる。そのようにしたい人は、そうしなさい。

~/.forward は、emacs でテキスト・ファイルとして作成するとよい。

$ emacs ~/.forward [←]
$ cat ~/.forward [←]
\s2054321, myaddr@xxx.yyy.zzz
(これは一例なので真似しないように)
$ []
設定が完了したら、必ず自分自身の coins のアドレス (例えば学生番号が 202054321 なら s2054321@coins.tsukuba.ac.jp)にメールを書き、次のことを 確認しなさい。

練習問題(3147) 筑波大学全学計算機の転送機能

筑波大学全学計算機の電子メール機 能( @s.tsukuba.ac.jp )には、転送機能がある。この機能の設定方法を確認し なさい。 必要に応じて、設定しなさい。ただし、 転送におけるループの危険性 を理解した上で、ループが起きないよう設定しなさい。

■課題(30) 端末(2)

ssh で情報科学類のコンピュータに遠隔ログインした後、以下のことを行いな さい。そして、レポートの採点者が指定されたことがきちんと行えたことを簡 単に確認できるようなレポートを作成しなさい。

レポートには、指定されていなければ、端末の全ての表示を含めなさい。全て の表示とは、シェルのプロンプト、自分が打ち込んだコマンド、コマンドの実 行結果である。端末が持つコピー機能でコピーし、テキストエディタ(のウィン ドウ)にペーストするなどして、テキストをコピーして、レポートに含めること。 レポートとして、画像を提出してはならない。

「[高度]」と印が付いているものは、やらなくても良い。

(1) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をレポー トに含めなさい。

  1. 端末プログラムで、2つのウィンドウを開く。 (その他に、必用ならば、レポートを作成するためのウィンドウを開く。)
  2. 2つのウィンドウで、ssh により情報科学類内の「同じ」コンピュータに 遠隔ログインする。
  3. 最初のウィンドウでは強制終了させてもよいプロセスを作成する。プ ロセスの作成方法としては、たとえば、lv コマンドでテキスト・ファイルを表 示する方法が考えられる。
    $ lv /etc/passwd [←]
    
  4. 2目の端末で ps コマンドを実行し、3. で作成したプロセスを表示する。 grep コマンドと組み合わせることが望ましい。
    $ ps | grep lv [←]
    (表示)
    $ []
    
  5. kill コマンドを使って、3. で作成したプロセスを殺しなさい。
    $ kill pid [←]
    
  6. ps コマンドの結果を示し、6. でプロセスがきちんと死んだこと(表示さ れないこと)を示する。
    $ ps | grep lv [←]
    (表示)
    $ []
    
レポートには、3. から 6. の、端末の表示を含めなさい。

(2) シェルが持つ標準入出力の切り替え機能を使って、次のコマンドの結果を 全て含む1つのファイルを作りなさい。

(3) 自分のホーム・ディレクトリとその下にあるファイルについて、次のこと を行いなさい。

  1. ホームディレクトリのモードを ls -ld で表示しなさい。
    $ ls -ld ~ [←]
    
  2. ホーム・ディレクトリの次の属性を示しなさい。
  3. ホームディレクト以下に、次のようなモード rw-r--r-- のファイル file522.txt が存在したとする。課題のためにこのようなファイルを作成して も良い。作成しないで考えるだけでも良い。以下の例で、sXXXXXXX は、自分の ログイン名とする。
    $ cd ~ [←]
    $ ls -l file522.txt [←]
    -rw-r--r--  1 sXXXXXXX  ugrad  4  5 20 10:43 file522.txt
    $ []
    
    このファイルを、coins の「他の利用者」が cat コマンドで読み出そうとした 時に何がおきると考えられるか。簡単に答えなさい。(実際に他の利用者に試 してもらって良い。考えるだけで実際には試さなくても良い。

    他の人の操作

    $ cd ~sXXXXXXX [←]
    $ ls -l ~sXXXXXXX/file522.txt [←]
    $ cat ~sXXXXXXX/file522.txt [←]
    
  4. このファイル file522.txt と同じモードのファイルが、自分のホームディ レクトリにあるか ls -al で調べなさい。あれば、その例を1個以上、5個以内 で答えなさい。なければ無いと答えなさい。

    調べるには、ls -l コマンドとlv コマンド、grep コマンドを使う方法もある。

    $ ls -la | lv [←]
    $ ls -la | grep rw-r--r-- [←]
    

(3) 次のファイル名を次のファイル名やディレクトリを、シェル変数を設定し て短く表現しなさい。

    /usr/bin/awk
    /usr/bin/gcc
    /usr/bin/openssl
短く表現したものを、ls -ld コマンドの引数に与えて実行しなさい。
$ シェル変数の代入1 [←]
$ シェル変数の代入2 [←]
$ シェル変数の代入3 [←]
...
$ シェル変数の代入n [←]
$ ls -l シェル変数の参照を利用短い表現 [←]
lrwxrwxrwx. 1 root root 4  2月 18  2019 /usr/bin/awk -> gawk
$ ls -l シェル変数の参照を利用短い表現 [←]
-rwxr-xr-x 2 root root 768592  3月 25  2020 /usr/bin/gcc
$ ls -l シェル変数の参照を利用短い表現 [←]
-rwxr-xr-x 1 root root 555304  9月  1  2021 /usr/bin/openssl
$ []
ヒント1: シェル変数への代入は、1回以上、何回でもよい。

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

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

(4) echo コマンドを使って、次の文字列を画面に表示しなさい。 なお、3行目では、AとBの間に空白が3個ある。

Lib*
????top
A   B
<yes><no>
Let's go
#help
たとえば、次のように回答しなさい。
$ echo 回答内容 [←]
Lib*
$ echo 回答内容 [←]
????top
$ echo 回答内容 [←]
A   B
$ echo 回答内容 [←]
<yes><no>
$ echo 回答内容 [←]
Let's go
$ echo 回答内容 [←]
#help
$ []
注意:これは、 メタキャラクタをエスケープ する課題である。単に echo コマンドに対してこのような文字列を与えればよ いということでない。 練習問題 「*」のエスケープ練習問題 様々なシェルのメタキャラクタのエスケープ 参照。

(5) 練習問題(3075) から 練習問題(3085) まで から1つ選んでシェル・スクリプトを作成しなさい。 作成したシェル・スクリプトを、ディレクトリ ~/bin に起きなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。

(6) 次のように、quota コマンドを実行し、その結果について考察しなさい。

  1. quota コマンドを実行する。
  2. cp, echo, emacs 等でホームディレクトリ以下に 1 バイト以上の削除しても良いファイルを作成する。
  3. もう一度 quota コマンドを実行する。
  4. rm コマンドで 2. のファイルを削除する
  5. もう一度 quota コマンドを実行する。
この端末の結果をレポートに含めなさい。

これらの quota コマンドの出力で、変化すると思われる部分と変化しない部分 がある。変化する部分は、何を意味するのか説明しなさい。変化しなかった部 分で、重要な数字を1つ選び、何を意味するのか説明しなさい。

(7) 正規表現の検索機能を用いて、次のファイルやコマンドの出力から 目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。 なお、grepコマンドで OR の機能が必要ならば、-e オプションを複数与える方 法がある。egrep コマンドの「|」を用いれば 1 回で終わることもある。

(8) [高度] 情報科学類 Coins の Web サーバを用いて、次のような URL で HTML の Web ページを公開しなさい(不用なら、レポートを作成した後で削除す ること。また、chmod コマンド等で、モードを元に戻すこと。)

この例で、sXXXXXXX は、各自自分の Coins でのログイン名とする。また、 randomstring には、ランダムな文字列を指定する。

このファイルを作成し、ls -l でそのモードを表示しなさい。そのファイル名 を「~」を使って指定しなさい。

情報科学類のコンピュータ www.coins.tsukuba.ac.jp では、 (viola5.coins.tsukuba.ac.jp) では、Apache httpd というWeb サーバが UID 48 (ユーザ名 apache) で動作している。 このプロセスを、ps コマンドと grep コマンドを使って表示しなさい。これら のコマンドを打つ前に、ssh で www.coins.tsukuba.ac.jp にログインしてから 行うこと(viola12 や aloe では不可)。端末の表示をレポートに含めなさい。

$ ps オプション | grep 引数 [←]
Web ブラウザで http://www.coins.tsukuba.ac.jp/~sXXXXXXX/randomstring.html という URL を開いた時、Apache Web サーバのプロセスは、ホームディレクト 以下のどのファイルを開いて読もうと試みるか。そのファイル名を「~」を使っ て答えなさい。

Apache Web サーバのプロセスが、そのファイルを読み事ができ、Web ブラウザ にその内容が表示されたとする。そのことから、ホームディレクトリを含む、 いくつかのディレクトリのモードのうち、特定のビットが1になっていることが わかる。各ディレクトリについて、どのビットが1になっているかを答えなさい。 たとえば、次の例のように、ls -ld の結果を表示し、その下の行に、1になっ ている部分に「^」のマークをつけなさい。

$ ls -ld ~
drwxr-xr-x 58 yas prof 8192  3月 28 11:48 /home/prof/yas
         ^
ヒント: ホームディレクトリを含めて3つのディレクトリが関係する。

作成した Web ページを、Web ブラウザで表示しなさい。その後、 Web サーバが生成しているアクセスログから、自分自身がアクセスした記録を 抜き出しなさい。 それには、次のような方法がある。

アクセスログのうち、「数行」をレポートに含めなさい。 grep コマンドや tail コマンドを利用すること。
Last updated: 2022/06/28 17:28:46
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>