シェル・スクリプト、bash alias、quota、ファイルの整理、シンボリックリンク、Emacs dired

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

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

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

■連絡事項

■補足

課題の使い方 The Unix Super Text の使い方

■復習

■シェル・スクリプト

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

◆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   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 19 16:27 bin
$ []
echo コマンド、 historyコマンド あるいは、コピー&ペースト機能を用いて 端末から打ち込んだものを結果をファイルに保存する。以下の例では、echo コ マンドを使ってファイルを作成している。
$ []
(^p で1行もどす。)
$ ls -l | sort -k 5 -nr | head [←]
(^a で、行頭に移動して 「echo '」と打ち、^e して
「' > ls-desktop」 と打つ)
$ 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 20 08:19 ls-size10
$ []
不要な部分をエディタで削除すれば、シェル・スクリプトの完成である。この 例では不要な部分がないので、シェル・スクリプト ps-emacs は完成してい る。完成したシェル・スクリプトを実行するには、次のようにbash コマンドの 引数としてファイル名を指定すればよい。
$ bash ls-size10  [←]
-rw-r--r--@  1 yas  prof   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 19 16:27 bin
$ []
bash で動くものは、sh でも動くことが多い。
$ sh ls-size10  [←]
-rw-r--r--@  1 yas  prof   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 19 16:27 bin
$ []

◆シェル・スクリプトの作り方(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 20 08:22 ls-size10
$ chmod +x ls-size10 [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 20 08:22 ls-size10
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-size10  [←]
-rw-r--r--@  1 yas  prof   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 19 16:27 bin
$ ~/ls-size10  [←]
-rw-r--r--@  1 yas  prof   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 19 16:27 bin
$ []

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

完成したスクリプトを ~/bin に置くと、他のコマンド(ls, cp, emacs) 等と同じように実行することができる。
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv ls-size10 ~/bin [←]
$ ls-size10  [←]
-rw-r--r--@  1 yas  prof   169125  5  9 15:36 mypicture.jpg
-rw-r--r--@  1 yas  prof   169125  5  8 15:08 mypicture2.jpg
drwx------  75 yas  prof     8192  5 20 00:49 _OLD_HOME_
drwxr-xr-x   5 yas  prof     6144  5 26 17:19 dot
drwx------   5 yas  prof     5120  5 30 10:10 Desktop
drwxr-xr-x  58 yas  prof     4096  4 13 18:11 coins
drwxr-xr-x   5 yas  prof     4096  4 10 13:46 public_html
-rw-r--r--   1 yas  prof     3984  5 30 10:32 literacy-a2-sjis.txt
-rw-r--r--   1 yas  prof     3178  4 15 15:56 file100.txt
drwxr-xr-x   3 yas  prof     3072  6 20 08:24 bin
$ []

◆シェル・スクリプトの作り方(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  33  6 19 16:14 ls-size10
$ cp ls-size10 lss [←]
$ ls -l lss [←]
-rwxr-xr-x  1 yas  prof  41  6 20 08:28 lss
$ emacs lss [←]
(修正)
$ cat lss [←]
#!/bin/bash
ls -l $1 | sort -k 5 -nr | head -$2
$ ls -l lss [←]
-rwxr-xr-x  1 yas  prof  48  6 20 08:29 lss
$ []
(cp の時点で x ビットは立っているので chmod +x は不要。)
この例では、ls-size10 で ls には引数はなかったが、 lss では「$1」を与えている。 「$1」は、コマンドに与えられた引数のうち、1番目のものを意味し ている。また、head には -$2 を与えている。

実行例

$ lss /bin 5 [←]
-r-xr-xr-x  1 root  wheel  1315248  2  6 17:03 ksh
-r-xr-xr-x  1 root  wheel  1228304  2  6 16:57 sh
-r-xr-xr-x  1 root  wheel  1228240  2  6 16:57 bash
-rwxr-xr-x  1 root  wheel   530320  2  6 17:03 zsh
-rwxr-xr-x  2 root  wheel   357984  2  6 17:03 tcsh
$ lss /usr/bin 3 [←]
-r-xr-xr-x   1 root   wheel  11832736  5 16 12:26 emacs
-rwxr-xr-x   1 root   wheel  10001104  3 18 14:08 php
-r-xr-xr-x   1 root   wheel   5308832  2  6 17:03 parl5.16
$ []

◆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 では、次のようなことを行う。

◆環境変数PATH

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

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

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

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

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

◆~/bin

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

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

■エイリアス(alias)

エイリアスとは一般に「別名」の意味。1つのものに2つ以上の名前をつける。

目的

◆bashのエイリアス

bash では、コマンドに別の名前をつける。長いコマンドラインを楽に打ち込む ため機能。 MacOS のファイルに対する alias とは別の話。

◆aliasにするかシェル・スクリプトにするか

alias とシェル・スクリプトには共通点が大きい。 aliasの代わりに、関数を使う方法もある。 The Unix Super Text 40.15.5 参照

◆aliasの例:cd ~/public_html/htdocs

cd ~/public_html/htdocs」を簡単に実行するためのコマンド 「cd-web」 を alias として定義する。
$ cd-web [←]
-bash: cd-web: command not found
          # 最初は cd-web というコマンドは見つからない
$ alias cd-web [←]
-bash: alias: cd-web: not found
          # 最初は cd-web という alias も見つからない
$ alias cd-web='cd ~/public_html/htdocs' [←]
          # aliasの定義
$ alias cd-web [←]
alias cd-web='cd ~/public_html/htdocs'
          # aliasの定義の確認
$ pwd [←]
/home/prof/yas
          # 最初はホーム・ディレクトリに居る
$ cd-web [←]
          # 定義したaliasの実行
$ pwd [←]
/home/prof/yas/public_html/htdocs
          # ~/public_html/htdocs に移動している。
$ []

◆~/.bashrcへのaliasの登録

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

~/.bashrc に alias の定義を追加したものを有効にするには、次のような方法 がある。

既に実行しているシェルには反映されない。実行しているシェルに反映させる には、「.」コマンド、または、「source」コマンドを用いて、現在の読み込ま せる。
$ . ~/.bashrc [←]
$ []
$ source ~/.bashrc [←]
$ []

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

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

iTerm が開かない時には、Dock の Emacs で修正したり、Windows で修正する。

■quota

◆ディスク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 使っている。 ファイル数は、 個。ファイル数の上限は、ない。

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

◆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 と答える。

コマンド名の置換え(alias)等て、rm を rm -i に変えることは、一般的には勧 められない。「rm -i [←] y」という操作が、一連の操作として身に付い てしまうので。

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

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

例:

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

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

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

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

■木構造の制約と問題点

大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。

◆こうもりの分類問題

図13 こうもりの分類(1)
図13 こうもりの分類(1)

図14 こうもりの分類(2)
図14 こうもりの分類(2)

木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。

2つの節に、「別名」をつけて、2つの道からたどり着けるようにする。 (木構造では、1つの節にたどり着く道は、ただ1つしかない。)

注意:bash, csh の alias とファイル名の alias (Macintosh) は、まったくの別物。

図15 こうもりの分類(別名つき)
図15 こうもりの分類(別名つき)

◆ハイパーテキストとハイパーメディア

木構造を補う方法として、 ハイパーテキスト を使うことがある。

シンボリック・リンク(symbolic link)は、Unix で、ファイルに別名をつける ための機能。「リンク」とは、木構造の枝の意味で、つまり、ファイル名を意 味する。シンボル(symbol)は、(数ではなくて)文字列であることを意味する。 シンボリック・リンク(symbolic link)は、文字列の形で、ファイルの別名を保 持している。

例:java コマンド

$ ls -l /usr/bin/java [←]
lrwxr-xr-x  1 root  wheel  74  6 16 11:54 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ []
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ れる。 ファイル /usr/bin/java を参照すると、 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/ にある java が使われる。
$ ls -l /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java [←]
-rwxr-xr-x  1 root  wheel  54624  2  7 20:38 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ []

シンボリック・リンクを作成するには、ln -s コマンドを使う。

$ ln -s oldname newname [←]
この結果、newname でファイルを参照すると、 oldname というファイルが使われる。(このファイルは、 newnameoldname の2つの名前を持つ。)

cp コマンドは、コピー元にシンボリック・リンクを指定しても、リンクの先の ファイルをコピーする。
$ cat file1-slink.text  [←]
file1
$ ln -s file1.text file1-slink.text  [←]
$ ls -l file1.text file1-slink.text  [←]
lrwxrwxrwx  1 yas  prof  10  6 13 12:13 file1-slink.text -> file1.text
-rw-r--r--  1 yas  prof   6  6 13 12:13 file1.text
$ cp file1-slink.text file2.text [←]
$ cat file2.text  [←]
file1
$ []

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

手引き 1.4.1 参照

MacOSX の Finder は、次のような役割を持つ。

◆MacOSX openコマンド

端末を開き、コマンドラインで操作をしている時、open コマンドを使うと ディレクトリを Finder で開くことができる。また、 アプリケーションを実行する(Finder でダブルクリックする) ことができる。

◆デスクトップ

ログインすると、何もウインドウを開いていない状態で「デスクトップ」と呼 ばれる特別の場所にあるファイルやディレクトリが画面に表示される。

デスクトップは、MacOSX では、ホーム・ディレクトリの下の 「~/Desktop」という名前のディレクトリに対応している。

◆ゴミ箱(trash)

Finder でファイルを削除する。この時、実際にファイルを削除するのではなく、 一度、「ゴミ箱」に入れる。 ゴミ箱に入れたファイルは、rm コマンドで削除したものと違って、(入れた直 後なら)元の状態にすることができる。Dock の「ゴミ箱」をクリックすると、 Finder でフォルダのように表示される。そこから、ドラッグで普通のフォルダ に移動させる。

注意事項

◆MacOSX alias

MacOSX には、Unix 系オペレーティング・システムで共通に使える シンボリック・リンクの他に、MacOSX 独自の(MacOS9以前から引き継いだ) 機能として、ファイル名に対するエイリアス(alias)の機能がある。

シンボリック・リンクとエイリアスの違い

■Emacs

◆Emacsのディレクトリ・エディタ

Emacs には、ディレクトリを表示して、ファイルを削除したり、ファイル名を 変える機能がある。これを dired (directory editor) という。 The Unix Super Text 19.4.4 (2) dired 参照

◆expand コマンド

iTerm の結果結果を Emacs にペーストする時に、タブが含まれているために、 自動的に字下げが行われて、表示が乱れてしまうことがある。 expand コマンドをつかうと、タブを空白に置き換えてくれる。
$ ls [←]
(タブ入りの表示、横)
$ ls | expand [←]
(タブを含まない表示、縦)
$ ls -C | expand [←]
(タブを含まない表示、横)
$ []
The Unix Super Text 35.2.7 exapnd、unexpand 参照

■実習

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

★練習問題(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/MacPorts/Emacs.app [←]
$ history [←]
(ヒストリの表示して、何行必要か数える。
history コマンド自身の分、1行多く保存する。)
$ history |tail -3 > run-fe [←]
 history |tail -3 > run-fe
$ cat run-fe [←]
  512  open /Applications/Firefox.app
  513  open /Applications/MacPorts/Emacs.app
  514  history |tail -3 > run-fe
$ emacs run-fe [←]
(不要な部分を削除する。1行目に #!/bin/bash と入れる。)
$ cat  run-fe [←]
#!/bin/sh
open /Applications/Firefox.app
open /Applications/MacPorts/Emacs.app
$ ls -l run-fe [←]
-rw-r--r--  1 yas  prof  70  6 16 15:35 run-fe
$ chmod +x run-fe [←]
$ ls -l run-fe [←]
-rwxr-xr-x  1 yas  prof  70  6 16 15:35 run-fe
$ ./run-fe [←]
$ ~/run-fe [←]
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-fe ~/bin [←]
$ run-fe [←]
$ []

★練習問題(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) フィルタ

Unix でフィルタとは、標準入力から入力したデータを加工して、結果を標準出 力へ出力するようなプログラムを意味する。

The Unix Super Text 35章 参照を参照して、フィルタを実行してみなさい。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

★練習問題(1915) ファイルの大きさの順に表示するls

ls -l は、ファイルの名前の順に表示する。これを、ファイルの大きさの順に 表示するシェル・スクリプトを作りなさい。
$ ls-size ~yas/syspro/www [←]
-rwxr-xr-x   1 yas  prof  27056 Jun 12 11:54 cgi-printarg.cgi
-rwxr-xr-x   1 yas  prof  18376 Jun 19 01:29 cgi-hello.cgi
-rw-r--r--   1 yas  prof   5287 Jun 12 11:54 cgi-printarg.c
-rw-r--r--   1 yas  prof   1579 Sep 26  2002 get.c
-rwxr-xr-x   1 yas  prof    985 May 20 17:17 cgi-printarg-ruby.cgi
-rw-r--r--   1 yas  prof    486 Jun 11 21:20 cgi-hello.c
-rw-r--r--   1 yas  prof    297 Sep 22  2003 Makefile
drwxr-xr-x   5 yas  prof    170 Jun 19 01:27 CVS
-rw-r--r--   1 yas  prof     54 Feb 14  2004 data
total 128
$ []
ヒント:ls -l の出力を sort コマンドでソートする。 ソートは、第5フィールドで行う。

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

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

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

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

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

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

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

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

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

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

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

注意: ~/.bashrc ファイルを編集することは、慎重に行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。

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

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

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

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

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

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

★練習問題(1925) bashの関数

bash の関数を利用してみなさい。 The Unix Super Text 40.15.5 参照

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

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

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

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

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

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

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

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

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

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

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

★練習問題(1930) treeコマンド

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Finder で、ファイルを削除することができる。このことを確認しなさい。

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

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

★練習問題(1943) Finder によるファイルの整理

Finder を利用して、ファイルを整理しなさい。

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

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

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

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

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

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

■課題19 シェル・スクリプト、bash alias、quota、ファイルの整理、シンボリックリンク、Emacs dired

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

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

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

(3) mkdir, rm, ln -s 等のコマンドや Finder を用いて、ファイルを整理しなさい。 レポートには次の項目を含めなさい。

シンボリック・リンクは使っても使わなくてもよい。

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

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

(4) [加点] ~/.bashrc に対してエイリアス、シェル変数、または関数を2つ定 義して追加しなさい。定義したものについて、それぞれ次のことを書きなさい。

ただし、この Web ページの中で例として示したものを定義して追加してはなら ない。それ以外のものを定義して追加し、報告しなさい。

注意: ~/.bashrc ファイルを編集することは、慎重に行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。

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

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

tee, uniq, tr, expand, sed, awk


Last updated: 2014/06/23 15:14:16
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>