シェル・スクリプト、quota、ファイルの整理

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

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

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

■連絡事項

■補足

筑波大学内の投票所, 筑波大学のトップページの RSS http://www.tsukuba.ac.jp/news/feed より。期間限定であることに注意。
住民票がつくば市に移して3ヶ月の人
大学で期日前投票ができる。
そうでない人
手続きすれば、大学で不在者投票ができるが、手続きに時間がかかるので、 大学の投票所での投票は間に合わないかもしれない。 つくば市役所等の投票所では間に合うとしても。 手続きしなければ、大学やつくば市役所では投票できないので、 地元に帰省して(期日前)投票する。
http://www.soumu.go.jp/18senkyo/about/moved.html参照。

筑波大学における情報システム利用のガイドライン にあるように、大学のネットワークで選挙運動はできないが、 インターネットでは選挙運動が可能。

http://www.nifty.com/net-senkyo/https://www.jaipa.or.jp/senkyo/http://www.soumu.go.jp/senkyo/senkyo_s/naruhodo/naruhodo10.html 参照。

■復習

■シェル・スクリプト

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

◆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   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ []
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 22 17:46 ls-size10
$ []
不要な部分をエディタで削除すれば、シェル・スクリプトの完成である。この 例では不要な部分がないので、シェル・スクリプト ls-size10 は完成してい る。完成したシェル・スクリプトを実行するには、次のようにbash コマンドの 引数としてファイル名を指定すればよい。
$ bash ls-size10 [←]
-rw-r--r--@  1 yas  prof   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ []
ls -l | sort -k 5 -nr | head」と長いコマンドを打たなくても良く なった。また、sort コマンドのオプションを覚えなくても良くなった。

◆シェル・スクリプトの作り方(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 22 17:49 ls-size10
$ chmod +x ls-size10 [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 22 17:49 ls-size10
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-size10 [←]
-rw-r--r--@  1 yas  prof   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ ~/ls-size10 [←]
-rw-r--r--@  1 yas  prof   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ []

◆シェル・スクリプトの作り方(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 22 17:49 /home/prof/yas/bin/ls-size10
$ ls-size10 [←]
-rw-r--r--@  1 yas  prof   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ []
ホームディレクトリにある「ls-size10」は、そのままファイル名を打 ち込んでも実行できない。mv コマンドで「~/bin/」に移動した後は、 「ls-size10」で実行可能になる。

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

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

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

$ cd ~/bin [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 22 17:49 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 22 17:54 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  5 17 10:33 sh
-r-xr-xr-x  1 root  wheel  1228336  5 17 10:33 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  5 17 10:33 emacs
-rwxr-xr-x   1 root   wheel  10121104  5 17 10:33 php
-r-xr-xr-x   1 root   wheel   5308832  2  6  2014 parl5.16
$ lss 10 [←]
-rw-r--r--@  1 yas  prof   67739  5 10 18:03 shinjo-picture-2016-05-10.jpg
-rw-------@  1 yas  prof   53811  5 10 18:02 shinjo-picture-2016-05-10-b.jpeg
-rw-r--r--@  1 yas  prof   21550  5  9 21:07 audio-sampling.png
-rw-r--r--@  1 yas  prof   14523  5  9 22:47 audio-sampling-2.png
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  3 23 14:53 dot
drwx------  11 yas  prof    5120  4 25 17:07 Desktop
-rw-r--r--   1 yas  prof    4492  4 26 18:29 literacy-a3.txt
-rw-r--r--   1 yas  prof    4226  4 19 17:53 literacy-a2.txt
-rw-r--r--   1 yas  prof    4213  4 19 17:52 literacy-a2.txt~
$ []

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

$ set a b c [←]
$ echo $1 $2 [←]
a b
$ echo $* [←]
a b c
$ shift [←]
$ echo $1 $2 [←]
b c
$ echo $* [←]
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
$ []
The Unix Super Text 40.22.1 参照

◆~/.bashrc

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

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

~/.bashrc を編集したら、一度、iTerm のウィンドウを問題なく開けるか、確 認すると良い。

~/.bashrc に問題があり、iTerm のウィンドウが開かなくなった時には、次の ような方法で修正する。

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でのシェル変数の設定の例

課題16(1) では、シェル変数を使って短い表現を行った。これを恒久的なものにするには、 ~/.bashrc に保存する。

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

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

◆環境変数PATH

環境変数PATHは、シェルのコマンドが含まれているディレクトリを設定するた めの環境変数である。 環境変数PATH も、参照。シェルは、コマンドのファイル名(相対パス名、または、絶対パス 名)を与えると、プログラムを実行する。 例:
$ /usr/local3/coins/macosx/bin/emacs [←]
$ /bin/ls [←]
環境変数 PATH にディレクトリ名を登録しておくと、ディレクトリ名を省略す ることができる。 例:
$ echo $PATH [←]
(省略):/usr/local3/coins/macosx/bin:(省略):/bin:(省略)
$ emacs [←]
$ ls [←]

◆~/bin

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

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

■bash alias (エイリアス)

■ファイルの整理

◆quotaコマンド

coins では、ホーム・ディレクトリ以下で個人がファイルを保存するために利 用できるディスクの上限が決まっている。上限や現在の利用量を表示するため には、quota コマンドを使う。 手引き 2.7.2 参照
$ quota -v [←]
Disk quotas for user yas (uid 1013): 
 Filesystem 1K blocks  quota limit    grace   files  quota limit   grace
      /home    959318      2764800  3072000   23138            0       0
coins の標準は、上限 3 GB (3*1024 KB)。これを超えると、ファイルを保存で きなくなる。電子メールも受信できなくなる。 90% の 2.7 GB (2764800 KB) を超える、すなわち、残り 10% を切ると、警告 のメールが飛ぶ仕組みがあるが、メールが飛ばないこともあるので、各自自分 で気をつける。 手引き 10.8 参照

上のユーザは、959,318 KB 使っている。 ファイル数は、23,138 個。ファイル数の上限は、設定されていない。

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

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

◆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.7.3 参照手引き 10.8 参照

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

The Unix Super Text 第9章 ファイルとディレクトリ 参照The Unix Super Text 第21章 ファイルとディレクトリの高度な操作 参照

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

◆ディレクトリ操作の復習

◆rm -i

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

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

■MacOSX Finder によるファイルの整理

■コンパイラとインタプリタ

人間が書いたプログラムを実行する方法には、大きく2種類ある。
コンパイラ(compiler, 翻訳系)を使う
人間が書いたプログラム(ソース・プログラム) を、一度、機械語に変換する。 機械語に変換するプログラムを、「コンパイラ」という。 実行時には、コンパイラは不要。
インタプリタ(interpreter, 通訳系)を使う
人間が書いたプログラムを(機械語に変換することなく)直接実行する。 このプログラムを実行するプログラムを、インタプリタという。 実行時にも、インタプリタが必要。

ソース・プログラム、コンパイラ、プロセス、CPU
図? コンパイラ方式でのプログラムの実行

プログラム、インタプリタのプロセス、CPU
図? インタプリタ方式でのプログラムの実行

シェルは、インタプリタ方式で動作する言語処理系とも言える。

コンパイラ方式とインタプリタ方式の中間的な方法もある。

ソース・プログラム、中間形式、インタプリタのプロセス、CPU
図? コンパイラとインタプリタの併用によるプログラムの実行

◆C言語

◆Java言語

◆/bin/sh

■実習

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

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

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

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

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

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

★練習問題(1905) sortコマンド

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

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

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

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

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

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

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

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

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

The UNIX Super Text 上巻 38.1 節の表 38-1 に間違いがある。

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

自分が関心がある世界の2つ以上の都市を選びなさい。それらの都市の現在時刻 を表示するシェル・スクリプトを作成しなさい。
$ date-cities [←]
Tokyo
2016年 6月22日 水曜日 22時43分45秒 JST
London
2016年 6月22日 水曜日 14時43分45秒 BST
New York
2016年 6月22日 水曜日 09時43分45秒 EDT
$ []

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

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

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

★練習問題(1909) ディレクトリの属性を表示する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 /
$ []

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

★練習問題(1914) ファイルの行数の順に表示する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 する。

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

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 がある。

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

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

★練習問題(1917) du コマンド

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

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

★練習問題(1919) quotaコマンド

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

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

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

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

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

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

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

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

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

★練習問題(1922) mkdir/rmdirコマンドによるディレクトリの作成と削除

Unix のコマンド mkdir コマンドと rmdir コマンドを使って、ディレクトリを 作成したり削除したりしなさい。

★練習問題(1923) ファイルが存在するディレクトリの削除

練習問題(1922) で、ファイルを削除しないで、rmdir コマンド実行すると、エラーになり、ディ レクトリを削除することができない。このことを確認しなさい。

ls コマンドは、「.」から始まるファイル名を表示しない。ls コマンドに -a オプションを付けると、表示する。

ディレクトリを削除しようとした時に、ls コマンドで表示されないが、「.」 で始まるファイルがあるために、削除できないことがある。このことを確認し なさい。 たとえば、 .DS_Store「._」から始まるファイル名 のファイルが存在することがある。

★練習問題(1924) mvコマンドによるディレクトリ間のファイルの移動

Unix のコマンド ls, mv を使って、ディレクトリ間のファイルを移動してみな さい。

★練習問題(1925) mvコマンドによるファイル名の付け替え

Unix のコマンド mv を使って、ファイル名を変更してみなさい。

★練習問題(1926) openコマンド

open コマンドは、Finder でダブルクリック(コンテキスト・メニューの開く) を行ったことと同じ効果がある。 ディレクトリ名を指定してopen コマンドを 実行すると、その内容を表示する Finder のウインドウが開く( .app のディレ クトリを除く)。 例: ディレクトリ名「.」を指定して、open コマンドを実行すると、カレント・ワー キング・ディレクトリの内容を表示する Finder のウインドウが開く。

★練習問題(1927) デスクトップ

次のようにすると、デスクトップをFinder で他のディレクトリと同じように表 示することができる。このことを確認しなさい。

★練習問題(1928) Finderによるディレクトリ間のファイルの移動

練習問題(1924) と同様に Finder で複数のディレクトリを表示して、それらの間でドラッグすることで、 ディレクトリ間でファイルを移動させることができる(mv コマンド相当)。 この機能を確認しなさい。

  1. 練習問題(1924) と同様に、 練習用のディレクトリとファイルを作成する。
  2. Finder で 2 つのウィンドウを開く。 その他に、open コマンドを使う方法もある。
    $ open ~/from_dir [←]
    $ open ~/to_dir [←]
    
  3. 移動元のディレクトリから、移動したいファイルを選択し、 移動先のディレクトリにドラッグする。
1つのディレクトリしか表示しない状態でも移動することはできるが、 マウスの操作が難しいので、2つ開いた方が良い。

★練習問題(1929) Finderによるディレクトリのファイルのコピー

Finder で、ファイルを選択肢し、コピー&ペーストで「コピー」することがで きる。このことを確認しなさい。

option キーを押しながらドラッグすると、移動ではなく、コピーになる。 このことを確認しなさい。

なお、コピーを行った後、元のファイルを消せば実質的に移動(改名)になる。

★練習問題(1930) Finderによるファイル名の付け替え

練習問題(1925) と同様に Finder を使って、(1つのディレクトリ内で)ファイル名を変更することがで きる。このことを確認しなさい。

★練習問題(1931) Finderによるディレクトリの作成

Finder で、フォルダ(ディレクトリ)を作成することができる。 このことを確認しなさい。

★練習問題(1932) Finderによるファイルの削除

Finder で、ファイルを削除することができる。このことを確認しなさい。 ただし、ファイルを「ゴミ箱」に入れただけでは、まだ完全に削除されたわけ ではない。ゴミ箱から取り出すことはできる。

★練習問題(1933) 「ゴミ箱を空にする」

ゴミ箱にファイルが残っている状態では、まだディスク quota を消費している。 「ゴミ箱を空にする」という操作を行い、その前後で quota が変化することを 調べなさい。

★練習問題(1934) 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 によるページ単位の表示。)
$ []

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

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

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、iTerm が開かなくなる等の問題が生 じることがある。(iTerm でウィンドウを開いても、すぐに bash が終了 してしまうことがある。)

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

★練習問題(1936) エイリアス 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
$ []

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

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

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

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

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、iTerm が開かなくなる等の問題が生 じることがある。(iTerm でウィンドウを開いても、すぐに bash が終了 してしまうことがある。)

~/.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 コマンドが有効になっている。
 $ []

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

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

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

環境変数LANGを次のものに変更するようなalias を定義しなさい。

★練習問題(1941) Cプログラムのコンパイルと実行

ccコマンド」 の所で用いたhello.c をコピーし、コ ンパイルし、実行しなさい。

★練習問題(1942) Javaプログラムのコンパイルと実行

javac コマンドと java コマンド」で用いた Hello.java をコピーし、コンパイルして実行しなさい。

■課題19 シェル・スクリプト、quota、ファイルの整理

以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

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

練習問題 1行からなるシェル・スクリプトの作成練習問題 historyからのシェル・スクリプトの作成 参照。

(2) quotaコマンドを実行しなさい。大きなファイ ルを cp コマンド等でコピーしなさい。その後、再び、quota コマンドを実行 しなさい。コピーの前後で数字が変化した部分と変化しなかった部分がある。 変化した部分は、何を意味するのか説明しなさい。変化しなかった部分で、重 要な数字を1つ選び、何を意味するのか説明しなさい。

練習問題 quotaコマンド参照。

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

次の項目について簡単に説明しなさい。

(4) [加点] mkdir, rmdir, cp, mv, rm 等のコマンドや Finder を用いて、ファ イルを整理しなさい。レポートには次の項目を含めなさい。

ディレクトリ構成の説明には、 treeコマンド の結果を利用してもよい。ただし、今回整理した部分だけを含めるこ と。~/Library/ など、自分では整理しなかったファイルについては、含めない こと。

課題が出される前に既にディレクトリを作成して既に既に整った状況であった 場合には、問題点の代わりに整理の考え方について説明しなさい。またディレ クトリを新たに作成する代わりに既存のディレクトリについて報告しなさい。

(5) [加点] The Unix Super Text の次の部分を読みなさい。

次のコマンドから 2 つ選びなさい。そして、各コマンドを利用したシェル・ス クリプトを作成しなさい。合計で 2 つのシェル・スクリプトを作成することに なる。1つのシェルスクリプトの中で以下から2つ以上のコマンドを利用しても よいが、その場合は、1つのシェル・スクリプトとして数える。作成したシェル・ スクリプトについて、(1) と同様の内容をレポートに含めなさい。


Last updated: 2016/07/15 14:14:35
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>