筑波大学 システム情報系 情報工学域 新城 靖 <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/
「端末」を複数開くと、「シェル」のプロセスが2つ。 プログラムとしては、同じ bash だが、プロセスとしては別物になる。
その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)
プログラムとプロセス
$ ls
プロセスには、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プロセスに対応。左から次のような意味を持つ。
/dev/ttys000
は
ttys000
になる。
TIME
CMD
(または COMMAND
)
$ tty
/dev/ttys000
$
$ 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)
U
(uninterruptible), D
(Disk),
S
(Sleep)、I
(Idle)
$ ps a
端末と結びついていないプロセスも含めるには、x オプションもつける。
$ ps ax
練習問題 ps lと親プロセス、 pstreeコマンド参照。 。
プロセスを殺すとは、プロセスが自主的に終了しない時に、強制的に終了させ ること。
Unix では、プロセスを殺す方法は、主に次の2つ。
注意: 端末プログラムでウィンドウを閉じたくらいでは、 問題のあるプロセスは死んでいないこともある。
$ 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行削除の意味。
^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 pid
-KILL
以外にも、様々な種類がある。詳しくは、man kill を参照。
ps プロセスの一覧の表示 ps x プロセスの一覧の表示 ps ax プロセスの一覧の表示 stty -a 端末の状態(キーの割り当て)の表示 ^C (キーボード) プロセスを殺す kill PID プロセスを殺す kill -KILL PID プロセスを殺す(必殺)PID はプロセス識別子。
PID
と打つのではない。
図? プログラムの標準入出力の普通の接続先
$ cat
Line 1
Line 1
Line 2
Line 2
^D
$
cat コマンドは、入力しているファイルが終わりになる(EOF, end of file)と、自動的に終了する。
キーボードからの入力は、無限に継続可能だが、^D
(Control + D) と打つと、
普通のファイルと同様に、ファイルの終わりという意味になる。
$ 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
$
$ 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
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
$
rwx------,rwxr-xr-x,rw-------
など)。
6,4,17,... など
)
yas
)のログイン名。
prof
)
3072,1024,25
など)
4月10日17時37分
など)
Desktop
など)
-
d
ファイルの型とファイルへのアクセス(読み書き)の可否を決めるための属性
ファイルのモードの例
各3文字はアクセス毎にその許可・拒否を表す。
r 読込み可 w 書込み可 x 実行可(ディレクトリの場合は探索可)モードで該当する部分が「
-
」の場合は、その種類のアクセスが許可さ
れてないことを意味する。
「読込み可」とは、その内容を参照できること意味する。たとえば、cp コマン ドでコピーできる。読出し可能なディレクトリなら、ls コマンドでそのディレ クトリ中のファイル名の一覧を表示できる。
「書込み可」とは、その内容を変更することができることを意味する。たとえ ば、テキスト・ファイルなら、エディタで修正したものを書き込むことができ る。書込み可能なディレクトリなら、mv コマンドでそのディレクトリのなかに あるファイル名前を変更できる。
「実行可」というのは、ファイルの内容がプログラムの場合は、 そのプログラムを実行することができる。
ディレクトリに対する 「検索可」というのは、その下にあるファイルやディレクトリを たどっていける(ファイルを開く(読み書きのため)、cd (change directory)できる)という意味である。
ディレクトリが「読込み可」でも、「検索可」でないと、 ディレクトリに「読込み可」のファイルがあっても、 ディレクトリに入ってファイルを読むことができない。 逆に、「検索可」でも、ディレクトリが「読込み可」でないと、 ディレクトリにあるファイル名やディレクトリ名を表示させることが できない。
そのディレクトリにあるファイル名を知っていて、そのファイルが「読み込み 可」なら読むことがでる。
アクセスするユーザによって異なったアクセスの許可・拒否がしたいことがあ る。そのために、rwxの指定は、ファイルの所有者、ファイルの属すグループ、 それ以外の人用に3セット用意されている。
例:モードが「rw-r--r--
」のファイル
rw-
」、
つまり「読み書きはできるが、実行はできない」
r--
」、つまり「読めるが書いたり実行したりはできない」
r--
」、つまり「読めるが書いたり実行したりはできない」
図? アクセス制御における主体、オブジェクト、および、操作
アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。
図? 実世界のユーザとUNIX中のプロセス・ファイル
Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。 ファイルとプロセスには、UID が付加されている。
1人のユーザが複数のグループに属することができる。
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)
$
$ 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 である。
ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。
(ホームディレクトリ以下の)ディレクトリの x を使ったファイルへの読み込み アクセスの許可と禁止。
図? ディレクトリのxの働き
スーパー・ユーザ(super user)
は、UID が 0 。
特権ユーザ(privileged user)、
ルート(root)、
su
(su コマンド、あるいは super user の略)ともよばれる。
スーパーユーザのユーザ名は、慣例として
root
という文字列が使われる。
ファイルのバックアップなど、システム管理の作業には スーパー・ユーザの仕組みが必要になる。
chown
コマ
ンドを用いる。ただし、スーパーユーザの権限が必要である。
ファイルをコピーして、元ファイルを消すことはできる。
ファイルの GID 属性を変更するには、chgrp
コマンドを使う。
一般ユーザは、自分が属しているグループにのみ変更できる。
任意のグループに変更するには、スーパー・ユーザの権限が必要である。
$ 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 と同じ |
文字 | 意味 |
+ | 許可を追加する |
- | 許可を除く |
= | 指定した許可だけとする |
文字 | 単語 | 意味 |
r | read | 読込み可 |
w | write | 書込み可 |
x | execute | 実行可 |
X | execute | 実行可(所有者に対して「実行可」がある時だけ) |
chmod には、-R (recursive)オプションがある。 これは、ディレクトリをたぐり全部変更することを意味する。
rw-r--r--
rwxr-xr-x
rwxr-xr-x
rwx------
rw-r--r--
~/public_html
以下のファイル)
rwxr-xr-x
public_html
以下のディレクトリ)
rwxr-xr-x
または rwx--x--x
~
。~/public_html
の親ディレクトリ)。
x ビットを出す。
rw-rw-r--
または rwxrwxr-x
r-xr-xr-x
, r-x------
$ 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
$ X=100
...
$ export X
$
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100
$
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($
とunset)である。
$ 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
$
date
コマンドは、TZ
が設定されていないと、そのコン
ピュータの標準(coins では、JST
、Japan Standard Time の意味)を利
用して日時を表示する。
$ 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]](../icons/screen-tab.gif)
$ ls -ld /Applications/
$ ls -ld /Applications/Q
$ ls -ld /Applications/Q![[tab]](../icons/screen-tab.gif)
$ 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
$
$ 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
1 saykotoeri2
2 saykotoeri2
3 fg
4 dup
<中略>
500 history
$
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE
500
$
$ 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 (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)
例:サイズが大きいファイルの上位 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
$
シェル・スクリプトを実行する度にいちいち「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
$
~/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 に含まれている。)
シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 。 。
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
$
$1,$2,...
で参照できる。
$*
では、全ての引数を参照できる。
$#
で引数の数がわかる。
shift
コマンドで引数をずらすことができる。
a b c
が与えられた時の実行例。
$ echo $#
3
$ echo $1 $2 $3
a b c
$ shift
$ echo $#
2
$ echo $1 $2 $3
b c
$
#
」を使ってコメントを書くことができる。bash は、
文字「#
」移行、行末まで無視する。
$ echo a b # c d
a b
$ # echo a b c
$
$ 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
という名前のファイルにあるプログラムを自動的
に実行する。~/.bashrc
では、次のようなことを行う。
~/.bashrc を編集したら、一度、端末プログラムがウィンドウを問題なく開けるか、確 認すると良い。
~/.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
$ source ~/.bashrc
~/.bashrc
に保存する。
以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。
$ cat ~/.bashrc
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho.u.tsukuba.ac.jp
...
$
これを使うと、ssh が簡単になる。
$ ssh $www
$ ssh $icho
~/.bashrc
などを設定して、~/bin
を
環境変数PATH
に含まれ
るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを
~/bin
に置くと、ファイル名を指定しなくても
(「~/ファイル名
」や
「./ファイル
」打たなくて)、
~/bin
以下の短いファイル名で実行できるようになる。
coins では、標準で ~/bin
が PATH
に含まるように設定されて
いるので、各自設定する必要はない。
例:
何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。
ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。
ファイルのコピーでは、 シンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。
*,?,[]
) のパタンを使って、ファイル名で検索できる。
キー | 説明 |
---|---|
/パタン | 順方向検索 |
n | 順方向検索次候補 |
/![]() | 順方向検索次候補 |
?パタン | 逆方向検索 |
?![]() | 逆方向検索次候補 |
^a.*tion$
」。「aで始まり、tionで終わるもの」。
「^
」、「.
」、「*
」、「$
」 は、
メタキャラクタ。特別の意味を持つ。
メタキャラクタを含まない文字列も、正規表現として意味を持つ。
$ 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
$
$ 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 の「ゴミ箱」に入っているファイルもディスク容量を使用してい る。「ゴミ箱を空にする」という操作を行って初めて使用中のバイト数が減る。
^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 ディスククォータに関する警告メールが来てしまった 参照。
~/Downloads/
)にファイルを保存することがある。
ここにある不用なファイルは削除すべきである。
~/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
$
ホーム・ディレクトリ ~
、デスクトップ ~/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
$ 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」という操
作が、一連の操作として身に付いてしまうので。
$ 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
$
rm
コマンドに -r
オプションをつけると、指定されたディレク
トリ以下の全てのディレクトリを削除する。
$ rm -r dir
rm -r
でも、書き込みできないファイルが含まれている時には、利用者
に問い合わせる。そのような問い合わせを行うことなく強制的に削除したい時
には、
-f オプション
をつけることもできる。
$ rm -rf dir
rm -r
は非常に危険なので、細心の注意にはらって実行すること。
C-x i
と打つ。
Insert file: ~/
Insert file: ~/挿入したいファイル名
端末の結果を、emacs にコピーする時に、タブをタブとして挿入し
たい時には、M-x local-set-key
で、次のようにタブ・キーの定義を
self-insert-command に変更する方法がある。
M-x local-set-key
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-f
find-file
C-x C-s
save-buffer
C-x C-c
save-buffers-kill-emacs (終了)
C-x C-f
find-file
C-x C-w
write-file
C-x C-s
save-buffer
C-x C-c
save-buffers-kill-emacs (終了)
C-x C-w
で書き込むこと
を奨める。さもないと元のファイルを壊してしまうことになる。
類似のことは、cp コマンド等で元のファイルを別のファイルにコピーしてから、 別のファイルを Emacs で修正してもできる。
図? Emacsのウィンドウとバッファとファイルの関係
C-x C-f
。
C-x 2
、C-x 3
C-x 1
、C-x 0
C-x b
C-x C-b
キー | 説明 |
---|---|
C-x 2 | ウインドウを2つに分割(現在のバッファを複数ウインドウで表示) |
C-x 1 | ウインドウを1つにする(他のウインドウを閉じる) |
C-x 0 | 現在のウインドウを閉じる |
C-x o | 他の(other)ウインドウにカーソルを移動。 |
C-x C-b | バッファのリストを表示 |
C-x b | 別のバッファを表示する |
M-x query-replace (M-%, Esc %) が便利。
M-% と打つと、ミニバッファで次のように聞かれる。
Query replace: 置き換え前の文字列
Query replace 置き換え前の文字列 with: 置き換え後の文字列
キー | 意味 |
---|---|
y (または SPC) | 置き換え |
n | 次の候補に移動 |
q | 終了 |
! | 以降すべて置換 |
その他に、次のような置換え機能がある。 。
http://www.coins.tsukuba.ac.jp/~ユーザ名/
http://www.coins.tsukuba.ac.jp/~ユーザ名/index.html
ユーザ名
」を、ログインの時に打つ自分のユーザ名
で置き換える。たとえば、学籍番号が 202054321 の人は、次のような URL で
参照される。
http://www.coins.tsukuba.ac.jp/~s2054321/
http://www.coins.tsukuba.ac.jp/~s2054321/index.html
~/public_html/htdocs
$ mkdir ~/public_html
$ mkdir ~/public_html/htdocs
http: ではなく https: が使いたい人は、次のような
URL を使う。
https://www.coins.tsukuba.ac.jp/~s2054321/
https://www.coins.tsukuba.ac.jp/~s2054321/index.html
~/public_html/secure_htdocs
$ mkdir ~/public_html
$ mkdir ~/public_html/secure_htdocs
mkdir の後、
ディレクトリのxの働き を理解し、
ホームディレクトと作成したディレクトリに対して
chmod コマンド で others に対して x ビットを立てる必要がある。
練習問題 Webページ用のディレクトリ作成
参照。
このディレクトリに index.html というファイルを作成すれば、 それが情報科学類での個人のホーム・ページの内容となる。
/var/log/httpd/access*
/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" combinedcombined という名前が付けられたログのフォーマットの意味は、以下の通りである。
アクセスログの他に、エラーが起きた時にもログが作られる。これを エラーログ という。エラーログは、情報科学類のサーバ www (www.coins.tsukuba.ac.jp) では、次の場所にある。
/var/log/httpd/error_log_*
/var/log/httpd/ssl_error_log_*
その他に、次のようなログを取ることもある。
ssl_request_log
(coins では
/var/log/httpd/ssl_request_log_*)
/var/log/httpd/suexec.log
等 (coins では /var/log/secure)
練習問題 学類 Web サーバのアクセス・ログの観察 、 練習問題 学類 Web サーバのアクセス・ログの観察(https) 参照。
~/.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
にログインした時にも、
alps
と himalaya
の両方のメールが読め、
また、himalaya
にログインしてもやはり
alps
と himalaya
の両方のメールが読める
と便利に思えるかもしれない。しかし、こうすることは技術的に難しいので、
しばらくはあきらめて欲しい。
\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
にメールが届いた
場合、次のようなことが起る。
alps
にコピーが残され、かつ、
shiro@himalaya.is.tsukuba.ac.jp
に送らる。
himalaya
では、やはり、コピーが残され(ここまでは順調)、
さらに、shiro@alps.is.tsukuba.ac.jp
に送られる(!)。
alps
では、コピーが残され(2回目)、himalaya
に送られる。
himalaya
では、コピーが残され(2回目)、
さらに、shiro@alps.is.tsukuba.ac.jp
に送られる。
alps
では、コピーが残され(3回目)、himalaya
に送られる。
himalaya
では、コピーが残され(3回目)、
さらに、shiro@alps.is.tsukuba.ac.jp
に送られる。
alps
では、コピーが残され(4回目)、himalaya
に送られる。
himalaya
では、コピーが残され(4回目)、
さらに、shiro@alps.is.tsukuba.ac.jp
に送られる。
3ヵ所以上でこの設定をしたとすると、中継される度にメールが増殖する。
\loginname
の機能を使っていなかったとすると、コピーは
残らないが、メールが行き来するだけで、どこにも届けられずにエラーになる。
~/.forward
の設定をしたら、必ず自分で自分あてに電子メールを出
して届くかテストすること。~/.forward
の設定を間違えると、エラー
のメールも届かなくなるので、エラーが起こっていることさえわからなくなる。
~/.forward
の機能は、もともとは、sendmail という種類のMTA (Mail Transfer Agent)の機
能である。他の MTA (qmail, postfix)でも使えるように設定していることが多い。
~/.forward
の応用として、他のアドレスに電子メールを転送するの
ではなく、(サーバ上で実行される)プログラムに転送する機能がある。すな
わち、(サーバ上で)プログラムを実行して標準入力に電子メールの内容を与
えるという機能がある。これには、次のように~/.forward
に書く。
"| /program/path/name arg1 arg2 arg3 ... argn"このように、
|
に続いて、プログラムのパス名と引数を書き、
全体を ""
で括る。
この機能を使って、受け取った電子メールを自動的に分類したり、
spamメール
を排除したりすることができる。たとえば、MH の
slocalやprocmail
と呼ば
れているプログラムがこの機能を使っている。
$ ps
$ ps l
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
$ ps l
$ ps -l
「-」の有無で、使い方が違うことがある。
$ ps u
$ ps -u ログイン名
他のオプションについて、man ps を見て見なさい。
/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 コマンドを使って次のようなことを行ってみなさい。
/etc/services
にある http
が含まれる行
/etc/services
にある pop
が含まれる行
/etc/services
にある imap
が含まれる行
ls
が含まれる行
grep コマンドには次のようなオプションを指定することができる。
$ 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
$ ps aux | lv
この方法を、確かめなさい。lv コマンドについては、
手引き 2.7.2 参照。
lv コマンド
を参照しなさい。q(終了)、次のページへの移動(スペースキー)、
ページを戻る(b)は、必ず覚えなさい。
$ 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
%MEM
VSZ
(Virtual Size)
RSS
(resident set size)
STARTED
$ 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。
$ 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 コマンドを打ちなさい。
横幅を広げるには、右下の斜線が入っている部分をドラッグすればよい。
$ top
$ top -o cpu
(CPU を消費している順)
macOS では、top コマンド自分自身が「重たい」と認識される。
その場合は、top コマンドが表示を変更する頻度を下げる。
$ top -s 4 -o cpu
man top でマニュアルを表示して、-o オプションと -U の使い方を
調べなさい。そして、メモリの利用順 (rsize) で表示しなさい。
-U オプションで自分自身のプロセスだけを表示しなさい。
$ top -U 自分のログイン名
$ top
$ ps x | grep top
(結果省略。PID を調べる。)
$ kill PID
$
$ cat > file1.txt
Line 1
Line 2
^D
$ cat file1.txt
Line 1
Line 2
$
$ cat
aaa
aaa
bbb
bbb
^C
$
なお、^C と 入力の終わりを意味する ^D は働きが異な
る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、
^C を使いなさい。
$ ls -R ~/Library
(大量の表示、省略)
^C
$
$ 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
C-c
) は、C-x C-c
のように、その
キーに割り当てられた関数を実行する意味。)
C-c
は、C-x
と同じように、2ストローク以上で1つの意
味をなすことが多い。何もない状態でC-c
を打った場合には、
C-g
によりキャンセルしなさい。
kill コマンドを使って、プロセスを殺してみなさい。
$ lv literacy-a4.txt
$ lv ~/.bashrc
$ ps
$ kill PID
lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。
$ 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 コマンドでも表示されない。)
$
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
$
最後は、PID が 1 番のプロセスにたどりつく。このことを確認しなさい。
$ pstree
$ pstree | lv
iTerm の画面の横幅を広げると見やすい。
macOS で、Command+Option+Esc キーを押すと 「アプリケーションの強制終了」のウインドウを表示できる。
(まず、Commandキー() と Option キーを左手で押し、
押しっぱなしの状態で、右手で Esc キーを一度押して離す。)
左上のアップル・メニュー(リンゴのアイコン)を押し、
「強制終了」を選んでも良い。
「アプリケーションの強制終了」のウインドウ
この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。
$ open "/Applications/Utilities/Activity Monitor.app"
または、Finder で、「移動」メニューから「ユーティリティ」を
選択。「アクティビティモニタ.app」のアイコンをダブルクリック。
(クリックで拡大)
アクティビティモニタの表示
表示されたら、「CPU」タブを表示しなさい。そして、 表示されるプロセスの順序を変えてみなさい。
topコマンド の表示と比較しなさい。
(クリックで拡大)
アクティビティモニタの表示、日本語入力プログラム、反応なし
この場合、次の手順で「日本語入力プログラム」のプロセスを殺しなさい。
「プロセス」のタブでは、CPU 時間の順番やメモリ使用量の順番に並べ替えな さい。
強制終了しても問題がなさそうな「アプリケーション」や「プロセス」を、強 制終了してみなさい。
$ 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
$
動作例:
$ 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 を見なさい。
$ 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
$
$ 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
$
$ lv /usr/share/dict/words
$ lv /etc/services
$ 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
$
このことを確認しなさい。
$ ls -l /usr/bin
$ ls -l /usr/bin | lv
$ ls -l /usr/bin
$ ls -l /usr/bin | head
$ ls -l /usr/bin | head -20
$ ls -l /usr/bin
$ ls -l /usr/bin | head
$ ls -l /usr/bin | head -20
$ ps aux | lv
$ ps aux | head
treeコマンド
の長い結果をページャで表示してゆっくり見る。
$ tree
$ tree | lv
$ grep yes /usr/share/dict/words | lv
$ tail /usr/share/dict/words | sort -r
まず、pbpaste コマンドを使って、Web ページの一部やiTerm の表示の一部を ファイルに保存しなさい。
$ pbpaste > file1.txt
$ emacs file2.txt
$ pbcopy < ファイル名
cat コマンドとパイプを使う方法もある。
$ cat ファイル名 | pbcopy
cat コマンドではなく、他のコマンドでも良い。
$ ps | pbcopy
$ ls -l | pbcopy
$ ls
(タブ入りの表示、横)
$ ls | expand
(タブを含まない表示、縦)
$ ls -C | expand
(タブを含まない表示、横)
$ ls -C | expand | pbcopy
(タブを含まない表示が、クリップボードにコピーされる。画面には表示されない。)
$
この動きを確認しなさい。
。
。
M-x shell-command
この機能を、C-u (Control+u) を付けて実行すると、コマンドを実行
してその結果を現在編集中のファイル(バッファ)に挿入できる。
C-u M-x shell-command
Shell command: 実行したいコマンド
この機能を確認しなさい。
dir > files.txt
type files.txt
type files.txt | more
$ id
$ whoami
$ groups
$ 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サーバ・プロセスからのアクセ
スも含む)がアクセスしようとしたらどうなるかを考察しなさい。
その他に、次のファイルやディレクトリのモードを調べなさい。
$ cd ~yas
$ ls -l
$ ls -l literacy-a*
$ lv literacy-a2.txt
$ lv literacy-a3.txt
$
$ cd ~yas
$ ls -l
$ ls -l literacy-a*
$ lv literacy-a4.txt
$ lv literacy-a5.txt
$
$ 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
を含めて、様々なモードの設定方法がある。
次の設定方法の意味を確認しなさい。
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でアクセス、再読み込み等>
$ 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 の表示がどのようになったかを含めなさい。
$ 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
という名前のディレクトリを用いる。名前に空白が含まれていることに注
意しなさい。このディレクトリの使い方は、次のページに書かれている。
http://support.apple.com/kb/PH13775,Share files using a drop box
http://support.apple.com/kb/PH13775?viewlocale=ja_JP,ドロップボックスを使用してファイルを共有する
~/Public/Drop Box
は、自動的には作
成されない。この練習問題では、このディレクトリを用いても良いし、他の名
前のディレクトリでもよい。
注意: この練習問題では、
インターネット上のファイル・サービス
https://www.dropbox.com/
を用いない。
他の人へのアクセスを防ぐ方法として、ファイル名に乱数(予測されない文字 列)を含める方法がある。この方法を練習してみなさい。
なお、cp コマンド等でコピーした場合には、ps コマンドで引数が表示される ことがある。このことを確認しなさい。ファイル名を秘匿してdrop box に書き 込む時には、ps で表示されない方法を使う必要がある。その方法を考えなさい。
/tmp
など、誰でも書き込みできる場所にファイルを作成すると、その
ファイルの UID 属性はどうなるか調べなさい。新たに実験用のディレクトリを
mkdir コマンドで作成しなさい。そのディレクトリのGID属性を chgrp で変更
し、その中に新たなファイルやディレクトリを作成したら、その GID がどう設
定されるかを確かめなさい。また、既存のファイルをmv コマンドで移動したら
どうなるかを調べなさい。
$ set
$ set | lv
どのようなシェル変数が設定されているか観察しなさい。
$ printenv
$ printenv | lv
$ echo $HOME
/home/prof/yas
$ printenv HOME
/home/prof/yas
$
注意: echo
の引数には、$
を付けるが、
printenv
の引数には、$
を付けない。
次のような環境変数の値を調べなさい。
$ date
$ echo $TZ
$ export TZ=EST
$ date
$ unset TZ
$ date
$
環境変数 TZ
に /usr/share/zoneinfo/
の下にあるファイル名
を設定して、その動作を確認しなさい。
$ echo $HOME
cd コマンドの引数に与えて、ホーム・ディレクトリや
ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd /
$ pwd
$ cd $HOME
$ pwd
$ cd /
$ pwd
$ cd $HOME/Desktop
$ pwd
$
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比
較しなさい。
$ 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 を実行するなどしてシェルを実行する。
$ 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
$
$ 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
$
$ echo '< > | { } ( ) [ ] & ; ^ " * ? ~'
< > | { } ( ) [ ] & ; ^ " * ? ~
$ echo "< > | { } ( ) [ ] & ; ^ ' * ? ~"
< > | { } ( ) [ ] & ; ^ ' * ? ~
$ echo \< \> \| \{ \} \( \) \[ \] \& \; \^ \" \* \? \~
< > | { } ( ) [ ] & ; ^ " * ? ~
$
" "
」 や シングルクォート
「' '
」の働きを調べなさい。
$ echo "$HOME"
(表示の確認)
$ echo '$HOME'
(表示の確認)
$ history
$ history | tail -5
(過去の5行だけ表示)
$ history | grep cd
(cd を含む行だけ表示)
$ history | lv
(ページャ lv でページ単位で表示。)
!
の後に番号
!!
^P
/^N
で選択して $ echo $HISTFILESIZE
history コマンドで表示されるコマンドの数を調べなさい。
$ history
<表示>
$ history | wc
$
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行
数である。
シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。
crocus39:~ yas$ echo "$PS1"
\h:\W \u\$
crocus39:~ yas$
この時、ダブルクォート ""
を付けないとうまく表示できないことがある。この理由を考えなさい。
シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな
さい。
crocus39:~ yas$ PS1="hi$ "
hi$
マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。
\h
\W
\u
$ set | wc
53 67 1566
$ set | lv
(表示省略。q で終了)
$ printenv | wc
24 29 1005
$ printenv | lv
(表示省略。q で終了)
$
" "
」 や シングルクォート 「'
'
」は、中に改行を含めることができる。逆に言うと、必ず閉じる
必要がある。閉じられていない場合には、シェルのプロンプトが$
から
>
に変化する。このことを確認しなさい。
$ echo "a
> b
> c"
(表示の確認)
$ echo 'a
> b
> c'
(表示の確認)
$
$ cat ~/.bashrc
#
# coins standard ~/.bashrc
#
if [ -f /usr/local/lib/standard/bashrc ]; then
. /usr/local/lib/standard/bashrc
fi
# add your own code below
$
まず、端末で何かコマンドを実行しなさい。以下の例では、 /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
$
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
$
$ 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
$
$ 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
$
1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。
$ emacs fruits.txt
$ sort fruits.txt
$ sort < fruits.txt
sort コマンドでよく使うオプション
$ date
2022年 4月15日 金曜日 12時12分46秒 JST
$ date-num
2022-04-15
$
ヒント: man date と man strftime 参照。
date コマンドの + で、strftime の説明にある format string を指定する。
$ 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 コマンドが使える。
$ 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 /
$
$ l2 file
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル
スクリプトが簡単になる。
$ lpshow file
(画面には、file.pdf が Preview.app で表示される)
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル
スクリプトが簡単になる。
ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。
$ ls-dot ~
.
..
.bashrc
.emacs
.login
$
ヒント
方法1:シェルの ファイル名置換でよく使われるパタン を利用し、「.*」というパタンで探す。
方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。
$ grep '^\.'
abc
.abc
.abc
aaa
.aaa
.aaa
^D
$
余裕があれば、-l などのオプションが付けられるようにしなさい。
$ lsd ~
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$
方法1: ls -F の結果から grep で「/」がついているものだけを抜き出す。
余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。
$ 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 する。
$ 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 がある。
$ ./countdown 3
3
2
1
0
$
$ diff-backup kadai10.txt
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停
止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ
い。
$ 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 によるページ単位の表示。)
$
~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。
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
$
$ alias
$ alias ll
名前='定義内容'
」
を引数として与える。例:
$ alias ll='ls -l'
$ unalias ll
~/.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 コマンドが有効になっている。
$
echo
でファイルに落すのではなく、alias
コマンドでエ
イリアスを定義する。
~/.bashrc
に追加する。
$ man lv
$ lv -h
$ cd ~
$ ls -R . | lv
$ ls -lR . | lv
$ ls -laR . | lv
-R
オプションは、このようにしばしば-l
オプションや
-a
オプションと一緒に使われる。また、-R
オプションは、大
量の結果を表示することが多いので、パイプに出力してページャで表示するこ
とが多い。
(これらのオプションを忘れた人は、man コマンドを見なさい。)
$ ls -l /Applications | grep '^l'
ここで、'^l'
は、
行の先頭がl
で始
まるという意味である。
。
$ lynx .
$ lynx ~
$ w3m .
$ w3m ~
^C
(Control+C)
で強制終了する。
$ du ~/Desktop
$ du ~/Documents
$ du ~/Downloads
$ du ~/Library/Caches
$ 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
$
~/Library/Caches/Firefox/Profiles/*/cache2/entries
$ 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 ブラウザについては、次のディレクトリ、その子供、親、兄弟の ディレクトリを観察してみなさい。
$ 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
$ quota
$ quota -v
この結果と、 du コマンド の結果を比較しなさい。
$ du -s -k ~
(表示までに時間がかかる。強制終了したければ、^C)
.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*
$
._
」が始まるファイル名のファイルが作られることが
ある。これは、他の 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 ._*
$
方法1: 引数にファイル名を与える方法。
C-x C-s
で保存
C-x C-c
で終了
C-x C-f
で、編集したいファイルを選ぶ。
存在しないファイルを選べば、新規作成として扱われる。
C-x C-s
で保存
C-x C-c
で終了
C-x C-f
で、元のファイルを選ぶ。
C-x C-w
で、別の(新しい)ファイルを選ぶ。
存在しないファイルを選べば、新規作成として扱われる。
C-x C-s
で保存
C-x C-c
で終了
$ ls -l literacy-a5.txt
-rw-r--r-- 1 yas prof 1990 5 8 21:17 literacy-a5.txt
$ ls -l literacy-a6.txt
ls: literacy-a6.txt: No such file or directory
$ cp literacy-a5.txt literacy-a6.txt
$ ls -l literacy-a6.txt
-rw-r--r-- 1 yas prof 1990 5 8 21:17 literacy-a6.txt
$
C-SPC
、または、C-@
でマークを設定する。
C-w
でカットする。
C-SPC
でマークを設定したいのに、できない場合には、
「システム環境設定>キーボード>ショートカット」で
Spotlight や入力ソースの切り替えに割当てられている
ショートカット・キーを変更したり解除すると良い。
キー | 説明 |
---|---|
C-SPC または C-@ | コピーする領域の先頭を決める(マークを設定する) |
C-w | マークした部分とカーソルの間の領域をカットする |
Esc w または M-w | マークした部分とカーソルの間の領域をコピーする |
C-y | コピー、または、カットしたものをペーストする |
C-SPC
または C-@ で、マークを設定する。
もし、C-SPC
がうまく動かない時には、
Spotlight のショートカット・キーの解除
を行う。
M-w
または Esc w
でコピーする。
C-y
でペーストする。
M-w
の代わりに C-w
を使うと、コピーでは
なくカットになる。
C-y
でペーストで
きる。
C-x C-x
で、カーソルの位置とマークの位置を入れ替えることが
できる。
キー | 説明 |
---|---|
C-x 2 | ウインドウを2つに分割(現在のバッファを複数ウインドウで表示) |
C-x 1 | ウインドウを1つにする(他のウインドウを閉じる) |
C-x 0 | 現在のウインドウを閉じる |
C-x o | 他の(other)ウインドウにカーソルを移動。 |
C-x C-b | バッファのリストを表示 |
C-x b | 別のバッファを表示する |
次のテキストを 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」の部分を自分の学籍番号に変えなさい。
|
」を用いれば 1 回で終わることもある。
Firefoxブラウザを操作して、 元の HTML (ソース)を表示 しなさい。
$ ls -l literacy-a2.txt
(1つのファイルの属性の表示)
$ ls -l literacy-a*.txt
(複数のファイルの属性の表示)
$ ls -ld ~
(ホーム・ディレクトリの属性の表示)
$ cd
(ホーム・ディレクトリへ移動)
$ ls -ld
(カレントワーキングディレクトリ==ホーム・ディレクトの属性の表示)
ファイルの属性 を参考にして、ls -l の結果を、解釈しなさい。今日の実習では特に 次の属性について着目しなさい。
r 読込み可 w 書込み可 x 実行可(ディレクトリの場合は探索可)
筑波大学情報学類コンピューティング環境では、 http: と https: で異なる Web ページの内容を公開できるようになっている。 http: の場合、個人の Web ページは、次のような URL で参照される。
http://www.coins.tsukuba.ac.jp/~ユーザ名/
ユーザ名
」を、ログインの時に打つ自分のユーザ名
で置き換える。たとえば、学籍番号が 202054321 の人は、次のような URL で
参照される。
http://www.coins.tsukuba.ac.jp/~s1854321/
~/public_html/htdocs
$ 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 で参照される。
https://www.coins.tsukuba.ac.jp/~ユーザ名/
~/public_html/secure_htdocs
注意:この練習問題は、練習問題 (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 で参照する。
http://www.coins.tsukuba.ac.jp/~ユーザ名/file1.text
ユーザ名
」を、ログインの時に打つ自分のユーザ名で置き
換えなさい。たとえば、学籍番号が 202054321 の人は、次のような URL を開
きなさい。
http://www.coins.tsukuba.ac.jp/~s2054321/file1.text
HTTP で始まる URL には、public_html/htdocs
は含まれないことに注
意しなさい。
注意:この練習問題は、練習問題 (3130)WWW ページ用のディレクトリ作成の後に行いなさい。
次の HTML ファイルを、ディレクトリ ~/public_html/htdocs
の下にコピー
し、それを Web ブラウザ表示しなさい。
~yas/public_html/htdocs/coins/literacy-2018/samples/sample1.html
$ 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 を開きなさい。
http://www.coins.tsukuba.ac.jp/~ユーザ名/sample1.html
ユーザ名
」を、ログインの時に打つ自分のユーザ名で置き
換えなさい。たとえば、学籍番号が 202054321 の人は、次のような URL を開
きなさい。
http://www.coins.tsukuba.ac.jp/~s2054321/sample1.html
HTTP で始まる URL には、public_html/htdocs
は含まれないことに注
意しなさい。
個人のホーム・ページを作成しなさい)。 各自のホーム・ページは、次の HTML ファイルに対応する。
~/public_html/htdocs/index.html
http://www.coins.tsukuba.ac.jp/~ユーザ名/index.html
http://www.coins.tsukuba.ac.jp/~ユーザ名/
URL でディレクトリを指定すると、自動的にそのディレクトリにある 「index.html」という名前のファイルが使われる。この機能を使うと、 各自のホーム・ページは、次のように短く表示できる。
http://www.coins.tsukuba.ac.jp/~ユーザ名/
$ cd /var/www/htdocs/
$ ls
<省略>
$ cat index.html
<省略>
$
$ cd /var/www/secure_htdocs/
$ ls
<省略>
$ cat index.html
cat: index.html: そのようなファイルやディレクトリはありません
$ cat index.php
<省略>
$
/var/log/httpd/access*
というファイルにためられる。
これを、次のコマンドを利用しながら観察しなさい。
$ hostname
viola5
$ cd /var/log/httpd/
$ pwd
/var/log/httpd
$
access*
の「*
」は、
シェルの
ファイル名置換
の意味である。
$ ls
(多くのファイルが表示される)
$ ls access*
(まだ多くのファイルが表示される)
$ ls access* | tail -1
access_log_20210609
$ ls -t access* | head -1
access_log_20210609
$
この例では、access_log_20210609
が最新のものである。
$ lv access上のlsの結果で置き換える
たとえば、上の例では、次のように打つ。
$ lv access_log_20210609
$ tail access上のlsの結果で置き換える
(表示がなされる。)
(しばらく待つ。)
$ tail access上のlsの結果で置き換える
(表示がなされる。)
(しばらく待つ。)
$ tail access上のlsの結果で置き換える
(表示がなされる。)
$
(しばらく間隔を空けてから)数回 tail コマンドを実行すると、その度に行
が増えているはずである。
たとえば、上の例では、次のように打つ。
$ tail access_log_20210609
$ tail access_log_20210609
$ tail access_log_20210609
$
https://www.coins.tsukuba.ac.jp/~syspro/2022/report/present.cgi,出席ボタン
」
を押すと、そこに表示されるので、それを利用する方法がある。
(出席ボタンは、何度押しても問題がない。授業時間外に押しても問題はない。
最終的に、授業時間内のものだけ集計される。
授業を履修していなくても、出席ボタンを押しても良い。
)
$ 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://www.coins.tsukuba.ac.jp/~syspro/2022/
をアクセスした後で、アクセスログを検索してみなさい。
あるいは、https: によるアクセスログ ssl_access*
を対象として
この練習問題、および、以下の練習問題を行っても良い。
練習問題 学類 Web サーバのアクセス・ログの観察(https)
参照。
$ tail -f アクセスログのファイル名
ここで「アクセスログのファイル名」は、
練習問題 学類 Web サーバのアクセス・ログの観察
で調べなさい。
たとえば、その練習問題の例では、次のように打つ。
$ tail -f access_log_20210609
-f オプションを指定すると、tail コマンドは終了することなく新しく追加さ
れた行を表示する。この tail コマンドは、自動的には終了しないので、終わっ
たら、
^C (Control+C) で強制終了させる。
$ cd /var/log/httpd/
ssl_access*
$ ls
(多くのファイルが表示される)
$ ls ssl_access*
(まだ多くのファイルが表示される)
$ ls ssl_access* | tail -1
(1つだけ表示される)
$ ls -t ssl_access* | head -1
(1つだけ表示される)
$
$ mkdir ~/public_html/secure_htdocs
$ mkdir ~/public_html/secure_htdocs/ディレクトリ名
次のドキュメントを参考にして、作成したディレクトリに .htaccess を作成し、
利用してみなさい。
例:パスワード・ファイル
/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
~/Maildir/
の下に保存する。その様子を ls コマンドや cat コマンドで観察しなさい。
$ ls ~/Maildir/
$ ls -a ~/Maildir/
$ ls ~/Maildir/cur
$ ls ~/Maildir/new
$ ls ~/Maildir/tmp
$ cat ~/Maildir/cur/ファイル名
このようなディレクトリの形式を Maildir 形式や Maildir++ 形式という。
注意: ~/Maildir/
以下には、IMAP サーバが利用する重要なファイルも
ある。削除したり壊さないように、慎重に操作すること。
coins 以外に日常的に読み書きするメール・アカウントがある人は、毎日 coins に届いたメールを確認する方法として~/.forward を設定して、転送する 方法が考えられる。そのようにしたい人は、そうしなさい。
~/.forward は、emacs でテキスト・ファイルとして作成するとよい。
$ emacs ~/.forward
$ cat ~/.forward
\s2054321, myaddr@xxx.yyy.zzz
(これは一例なので真似しないように)
$
設定が完了したら、必ず自分自身の coins のアドレス
(例えば学生番号が 202054321 なら
s2054321@coins.tsukuba.ac.jp
)にメールを書き、次のことを
確認しなさい。
レポートには、指定されていなければ、端末の全ての表示を含めなさい。全て の表示とは、シェルのプロンプト、自分が打ち込んだコマンド、コマンドの実 行結果である。端末が持つコピー機能でコピーし、テキストエディタ(のウィン ドウ)にペーストするなどして、テキストをコピーして、レポートに含めること。 レポートとして、画像を提出してはならない。
「[高度]」と印が付いているものは、やらなくても良い。
(1) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をレポー トに含めなさい。
$ lv /etc/passwd
$ ps | grep lv
(表示)
$
$ kill pid
$ ps | grep lv
(表示)
$
(2) シェルが持つ標準入出力の切り替え機能を使って、次のコマンドの結果を 全て含む1つのファイルを作りなさい。
(3) 自分のホーム・ディレクトリとその下にあるファイルについて、次のこと を行いなさい。
$ ls -ld ~
$ 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
調べるには、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 コマンドを実行し、その結果について考察しなさい。
これらの quota コマンドの出力で、変化すると思われる部分と変化しない部分 がある。変化する部分は、何を意味するのか説明しなさい。変化しなかった部 分で、重要な数字を1つ選び、何を意味するのか説明しなさい。
(7) 正規表現の検索機能を用いて、次のファイルやコマンドの出力から
目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。
なお、grepコマンドで OR の機能が必要ならば、-e オプションを複数与える方
法がある。egrep コマンドの「|
」を用いれば 1 回で終わることもある。
(8) [高度] 情報科学類 Coins の Web サーバを用いて、次のような URL で HTML の Web ページを公開しなさい(不用なら、レポートを作成した後で削除す ること。また、chmod コマンド等で、モードを元に戻すこと。)
この例で、sXXXXXXX は、各自自分の Coins でのログイン名とする。また、 randomstring には、ランダムな文字列を指定する。
http://www.coins.tsukuba.ac.jp/~sXXXXXXX/randomstring.html
情報科学類のコンピュータ 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 サーバが生成しているアクセスログから、自分自身がアクセスした記録を 抜き出しなさい。 それには、次のような方法がある。