エイリアス(コマンド)、シェル・スクリプト

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

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

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

■連絡事項

メモ用紙の作り方

■復習

■補足

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

■エイリアス(alias)

別名。1つのものに2つ以上の名前をつける。

目的

■cshのエイリアス

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

例:ls -l の代わりに ll というコマンドを使えるようにする。

% ls -l [←]
total 80
-rw-r--r--   1 yas  prof    281 Jun 22 13:14 Imakefile
-rw-r--r--   1 yas  prof   1072 Jun 22 13:31 Makefile
-rw-r--r--   1 yas  prof  14044 Jun 22 13:31 index.html
-rw-r--r--   1 yas  prof  10681 Jun 22 13:30 index.html-m4
-rw-r--r--   1 yas  prof  10129 Jun 22 13:14 index.html-m4.~1~
% ll [←]
tcsh: ll: Command not found.
% alias ll ls -l [←]
% ll [←]
total 80
-rw-r--r--   1 yas  prof    281 Jun 22 13:14 Imakefile
-rw-r--r--   1 yas  prof   1072 Jun 22 13:31 Makefile
-rw-r--r--   1 yas  prof  14044 Jun 22 13:31 index.html
-rw-r--r--   1 yas  prof  10681 Jun 22 13:30 index.html-m4
-rw-r--r--   1 yas  prof  10129 Jun 22 13:14 index.html-m4.~1~
% []
alias の機能
一覧表示
alias コマンドを引数なしで実行
% alias [←]
単独表示
alias コマンドに名前を引数として与える
% alias ll [←]
削除
unalias コマンドに名前を引数として与える
% unalias ll [←]

◆~/.cshrc

シェルは、起動されるとまず ~/.cshrc (csh run command) に含まれて いる命令を実行する。

alias の定義は、tcsh (csh) が終了すると、消えてしまう。 複数の端末で、複数の tcsh を実行しても、定義した端末だけ有効になるだけである。 他の端末では、定義されない。

毎回手作業で定義したくないなら、ファイル~/.cshrc に定義を含める とよい。csh は、実行されると、まずそのファイルに含まれているコマンドを 実行する。

tcsh は、csh にコマンドラインの編集機能がついたものである。tcsh は、 csh 用の設定ファイル ~/.cshrc を参照する。

◆coins 標準 ~/.cshrc

coins 標準の .cshrc は、次のようになっている。
#
# standard ~/.cshrc for coins users
#
if( -r /usr/local/lib/standard/cshrc ) then
	source /usr/local/lib/standard/cshrc
endif
演習などで、このファイルを消してしまった時には、次のようにすると回復できる。
% cd ~ [←]
% mv .cshrc cshrc-bad [←]
% cp /usr/local/lib/standard/cshrc-home .cshrc [←]
% []
path の設定には気をつける。講義などで独自の path にあるコマンドを実行す る必要がある時には、標準のものに「追加」する形にすることを進める。 以下の例では、/usr/local/xxx/bin を追加している。
#
# standard ~/.cshrc for coins users
#
if( -r /usr/local/lib/standard/cshrc ) then
	source /usr/local/lib/standard/cshrc
endif

# source の後で、$path を使いながら独自に設定する。
path = ($path /usr/local/xxx/bin)
独自に設定する方法では、問題が生じることがある。

悪い例1: 独自に設定する。目的のディレクトリだけを書く。/bin など大事な ものがない。

path = (/usr/local/xxx/bin)
悪い例2: 独自に設定する。coins でよく使う/sw/bin や /opt/local/bin, /usr/sbin などが抜けている。
path = (/usr/local/bin /bin  /usr/bin /usr/X11R6/bin /usr/local/xxx/bin)
/usr/local/xxx/bin)

◆aliasの引数

基本的には、シングルクォートの中で「'\!*'」のよ うに書く。「\」は、「\」か「¥」(ASCII で 5c(16進数))

例:引数で与えられたディレクトリを ls -l -t で調べて、そのうちの先頭の 10行だけを表示する。

% alias new10 'ls -l -t \!* | head' [←]
% new10 /bin [←]
total 8824
-rwxr-xr-x   1 root  wheel      40408 Feb 19 18:09 launchctl
-r-xr-xr-x   1 root  wheel     896720 Aug 23  2005 ksh
-rwxr-xr-x   2 root  wheel     491340 Aug 23  2005 zsh
-rwxr-xr-x   2 root  wheel     491340 Aug 23  2005 zsh-4.2.3
-r-sr-xr-x   1 root  wheel      24736 Aug 22  2005 rcp
-r-xr-xr-x   1 root  wheel      14440 Aug 22  2005 domainname
-r-xr-xr-x   2 root  wheel      18104 Aug 22  2005 [
-r-xr-xr-x   2 root  wheel      18104 Aug 22  2005 test
-r-xr-xr-x   1 root  wheel      13964 Aug 22  2005 sleep
% []
!*」と書きたいが、単に「!」を使うと、ヒストリが展開されてしまうので、 「\!」と書く。また、「*」がファイル名に展開されないように、 シングルクォート「''」で括る。

\!:1」のように、引数を区別する機能もある。

alias では、パイプ「|」もよく使われる。

◆alias置き換えの抑止

alias で、既存のコマンドと同じ名前のコマンドを定義することもできる。
% which md [←]
/usr/bin/md
% man md [←]
md(1)                     BSD General Commands Manual                    md(1)

NAME
     md -- process raw dependency files produced by cpp -MD

SYNOPSIS
     md [-d] [-f] [-m makefile] [-u makefile] [-o outputfile] [-v] [-x]
        [-D c|d|m|o|t|D]
...
% alias md mkdir [←]
% which md [←]
md:      aliased to mkdir
% []
alias を無効にして、元のコマンドを使いたい時には、コマンド名の 前に「\」をつける。または、コマンド名をフルパスで打つ。
% md [←]
usage: mkdir [-pv] [-m mode] directory ...
% \md [←]
usage: md -f -Dcdmot -m makefile -o outputfile -v  ... 
% /usr/bin/md [←]
usage: md -f -Dcdmot -m makefile -o outputfile -v  ... 
% []

◆Alias loop

alias の中で同じ名前のコマンドを使うこともできる。
% alias ls ls -F [←]
しかし、行の先頭以外では、Alias loop というエラーになる。
% alias ls 'dirs; ls \!*' [←]
% ls [←]
tcsh: Alias loop.
% []
この時には、alias を展開させないために、コマンド名の前に「\」を使う。
% alias ls 'dirs; \ls \!*' [←]
% ls [←]
~/public_html/coins/literacy-2006/2006-06-23 
Imakefile               index.html              index.html-m4.~1~
Makefile                index.html-m4
% []
コマンド名をフルパスで書く方法もある。
% alias ls 'dirs; /bin/ls \!*' [←]
% ls [←]
~/public_html/coins/literacy-2006/2006-06-23 
Imakefile               index.html              index.html-m4.~1~
Makefile                index.html-m4
% []

■シェル・スクリプト

(よく利用する)シェルに対するコマンドを、ファイルに保存して、(簡単に) 実行できるようにしたもの。alias と共通点が多いが、alias よりも複雑なこ とが書ける。簡単なプログラミングとも言える。

◆csh

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

tcsh は、csh に terminal での編集機能や補完機能を付けたもの。シェル・ スクリプトを書く時には、多くのシステムで備わっている /bin/csh を使うこ とが多い。(csh はあるが tcsh がないシステムもある。)

◆cshスクリプトの作り方

  1. まず端末から実行してみる。
  2. echo コマンドや history コマンドを使って端末から打ち込んだものを結 果を、ファイルに保存する。
  3. 不要な部分をエディタで削除し、必要な部分を付け足す
  4. 1行目に #!/bin/csh や #!/bin/csh -f と書き加える。
  5. chmod +x で実行可能属性を付ける
  6. (完成したスクリプトを ~/bin に置く)

◆シェルの選択

ただし、この場合、csh ではなくて、sh (/bin/sh)で実 行される。shcsh は、文法に共通性もあるので、問題ない 場合も多い。

問題がある場合、どうしても csh で実行させたい場合、テキスト・エ ディタで、行の先頭に「#!/bin/csh」と書き、csh で実行させる。

◆-fオプション

csh 用のシェル・スクリトプとは、実行されるとまず .cshrc に含まれている命令を実行する。 「#!/bin/csh -f」と、-f を付けると、~/.cshrc を読 み込まないので速くなる。ただし、~/.cshrc で定義した設定(aliasや環境変数 の設定)は効かないことがある。

ただし、環境変数は、今の状態を引き継ぎたいことが多いので、 ~/.cshrc を読み込ませない方が都合がよいことが多い。

◆引数

シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 The Unix Super Text 39.2.1 参照
% cat add [←]
#!/bin/csh -f
@ x = $1 + $2
echo $x
% ./add 10 20 [←]
30
% ./add 100 200 [←]
300
%
引数は、$1,$2,...$argv[1],$argv[2],... で参照でき る。$* では、全ての引数を参照できる。shift コマンドで 引数をずらすことができる。$#で引数の数がわかる。

csh では @ で簡単な計算ができる。空白で区切る必要がある。 The Unix Super Text 39.3節 参照

◆デバッグ

csh に -x オプションを付けて実行すると、画面にスクリプトを表示さ ながら実行する。
% csh -f -x run [←]

-n オプションを付けて実行して、構文のチェックだけ行う。

シェルに1行ずつ与えて実行してみる方法もある。

◆シェル変数path(環境変数PATH)とrehash

~/.cshrcなどを設定して、~/bin をpath シェル変数(PATH 環境変数)に含まれるようにすることを奨める。そして自分で作成したプログ ラムやスクリプトを、~/bin に置くと./ などで実行する必 要はない。

coins では、標準で ~/binpath に含まるように設定されている。

ただし、ファイルを作成し、chmod +x した後で、1度だけ rehash コマンドを打つ必要がある。rehash と打たれるまで、 tcsh は、コマンドが追加されたことに気がつかない。

% emacs ~/bin/newcommand [←]
% chmod +x ~/bin/newcommand [←]
% rehash [←]
% newcommand [←]
% emacs ~/bin/newcommand [←]
% newcommand [←]
% emacs ~/bin/newcommand [←]
% newcommand [←]
% []
chmodrehash も、シェルごとに1度だけやればよい。端末 をたくさん開いていた時には、作成したスクリプトをすぐに使いたい時にはそ れぞれのシェルで rehash コマンドを実行する。

rehash は、「ハッシュ表を作り直す」ことを意味する。csh は、コマ ンドを打つたびにpath で指定されたディレクトリにあるコマンドを探 すのではなく、ハッシュ表と呼ばれる、高速に検索するための仕組みを使って 検索している。

rehash は、新しいシェルが実行される時には自動的に行われている。 次にログインした時、chmod +x した後に開いた端末では rehash を実行する必要はない。

◆cshスクリプトでよく使われる機能

◆shスクリプトでよく使われる機能

sh (/bin/sh) は、Bourne SHell と呼ばれる。対話的な利用では、csh を使う人でも、シェルスクリプトを作成する時には、sh を使う人も多い。

実際には、Unix オリジナルの sh ではなく、bash (GNU Bourne-Again SHell) という高機能のプログラムが広く使われている。

■実行制御

シェルからプログラムを実行する時の方法。 The Unix Super Text 22.3 ジョブ制御 参照The Unix Super Text 11.6 実行制御 参照

◆フォアグランドとバックグランド

2種類のコマンドの実行方法
フォアグランド・ジョブ (foreground job)
そのコマンドのプロセスが終了するまでプロンプトを出さずに待っている。 コマンドは、キー入力できる。
バックグランド・ジョブ (background job)
コマンドのプロセスが終了を待たずに、すぐに次のコマンドを入力するた めのプロンプトを出す。コマンドは、キー入力できない。
バックグランドの利用法 今となっては、複数端末を開いてやればよいとも言える。

例: 大量のファイルを削除する

% rm -rf dir & [←]
[1] 7433
% []
コマンドの末尾に 「&」を付けると、バックグランドで実行され る。ジョブ番号とプロセス番号が表示され、すぐにプロンプトが洗われる。 終了すると次のような表示がなされる。
[1]    Done	rm -rf dir

◆順次実行

複数のコマンドを順次実行するには、「;」で区切る。
% who; date; sleep 10; date; who [←]
yas      ttyp0    Jun 18 12:39 (sharon.hlla.is.t)
Thu Jun 18 13:12:00 JST 2009
Thu Jun 18 13:12:10 JST 2009
yas      ttyp0    Jun 18 12:39 (sharon.hlla.is.t)
% []

◆グループ化

複数のコマンドをまとめることができる。

例: /bin と /usr/bin にあるファイルをしらべてホーム・ディレクトリにある commands というファイルに保存する。

% cd [←]
% (cd /bin; ls; cd /usr/bin; ls ) > commands [←]

◆終了ステータス

コマンドは、成功すると 0、失敗すると 0 以外を返す(ようにプログラムが記 述されているものが多い。)
% ls -ld / [←]
drwxrwxr-t   34 root  wheel  1190 May 12 09:34 /
% echo $status [←]
0
% ls -ld /aaaa [←]
ls: /aaaa: No such file or directory
% echo $status [←]
1
% []
コマンドが成功したか失敗したかを調べ、その結果に応じて次のコマンドを実 行するかしないかを決めたい。

command1 が成功したら、command2 を実行する。 (できれば、両方とも実行したい。)

command1 && command2
command1 が失敗したら、command2 を実行する。 (どちらか一方が実行できればよい)
command1 || command2

■実習

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

★練習問題(1901) ~/.cshrcの観察

自分のホーム・ディレクトリにある ~/.cshrc の内容を観察しなさい。
% lv ~/.cshrc [←]

★練習問題(1902) coins標準の cshrc の観察

自分のホーム・ディレクトリにある ~/.cshrc は、coins 標準のcshrc を source コマンドで読み込んでいる。その読み込んでいる先のファイルで どのような設定がなされているかを観察しなさい。
% lv ~/.cshrc [←]
% lv /usr/local/lib/standard/cshrc [←]
この cshrc で path にどのようなディレクトリを設定しているか調べなさい。 また、現在実行中のシェルの path の値と比較しなさい。
% echo $path [←]
% printenv PATH [←]
% echo $PATH [←]
シェル変数 path、または、環境変数 PATH に含まれているディレクトリには、 どのようなコマンドがあるかを調べなさい。例えば、/usr/local/bin を調べる には、次のようにする。
% ls /usr/local/bin [←]
path 以外にどのような シェル変数と環境変数 が設定されているかを調べなさい。

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

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

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

% open /Applications/Calculator.app  [←]
(^p で1行もどす。^a で、行頭に移動して echo と打ち、^e して > run-calc と打つ)
% echo open /Applications/Calculator.app  > run-calc [←]
% csh run-calc [←]
% []
tcsh の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 「|」があれば、「'シングルクォート'」で括る( '|') などして、エスケープする 。

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

% chmod +x run-calc [←]
% ./run-calc [←]
% []
必要ならば、エディタで1行目に「#!/bin/csh」か「#!/bin/sh」を入れる。
#!/bin/csh
open /Applications/Calculator.app 

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

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

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

複数行からなるシェル・スクリプトを作成しなさい。この場合、シェルにおけ る対話を保存するために echo コマンドではなく、history コ マンドを使う。
% history -h [←]
(ヒストリの表示して、何行必要か数える。history コマンドの分、1行多く保存する。)
% history -h 5 > run-xxx [←]
% emacs run-xxx [←]
(最後の history コマンドをテキスト・エディタで削る。)

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

/bin, /usr/bin には、C 言語で記述されたプログラムの他に、シェル・スクリ プト(主に/bin/sh)も含まれている。どのようなシェル・スクリプトがあるかを 調べなさい。

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

% file /usr/bin/apropos [←]
/usr/bin/apropos: Bourne shell script text executable
% ls -l /usr/bin/apropos  [←]
-rwxr-xr-x   1 root  wheel  2408 Aug 22  2005 /usr/bin/apropos
% lv /usr/bin/apropos [←]
% []

★練習問題(1907) 制御構造

The Unix Super Text 39.5 参照。 次の機能を確認しなさい。

★練習問題(1908) ジョブ制御

The Unix Super Text 22.3節 参照

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

★練習問題(1909) platexを2回実行する

platx コマンドを 2 回実行するシェル・スクリプトを作成しなさい。
% l2 file.tex [←]

★練習問題(1910) 条件付きでplatexを2回実行する

練習問題(1909) で、 1回目の実行でエラーが出た時には、2回目は実行しないように しなさい。

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

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

% lpshow file.tex [←]
(画面には、file.pdf が Preview.app で表示される)
ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、 標準では Preview.app が動作するが、他のプログラムにも変更できる。 この課題でも他のプログラムを使ってもよい。

★練習問題(1912) 条件付きでのplatex、dvipdfmx、Preview.appの連続実行

練習問題(1911) で、前のプログラムの実行でエラー が出た時には、次のプログラムは実行しないようにしなさい。

★練習問題(1913) C言語のソース・プログラムだけを表示するls

与えられたディレクトリのC言語のソース・プログラムだけを表示するシェル・ スクリプトを作りなさい。
% ls-c ~/syspro/file/ [←]
fd-print.c
file-copy.c
mmap-head.c
stdio-thru.c
utmp-print.c
wtmp-last10.c
ystat.c
ystat.h
ヒント:ls の結果から、egrep で .c や .h で終わるものを抜き出す。ある いは、シェルのパタン・マッチの機能を使って、*.c や *.h だけを取り出す。

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

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

ls コマンドや csh, tcsh, sh の * では、「.」から始まるファイルは表示 されない。逆に「.」から始まるファイルだけを表示する ls コマンドを 作りなさい。
% ls-dot ~ [←]
.
..
.cshrc
.emacs
.login
% []
ヒント:ls に -a オプションを付けると、全てのファイルを表示する。 先頭が「.」のものを抜き出す。

csh, tcsh, sh で 「.*」と指定して探す方法もある。

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

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

ディレクトリだけを表示する ls コマンドを作りなさい。
% ls-dir ~ [←]
Mail
lib
syspro
tmp
% []
ヒント:ls -l で、d から始まる行だけを抜き出す。あるいは、csh の -d や test の -d でディレクトリだけを選びだす。

できるだけ上のようにディレクトリの名前だけ表示するようにしなさい。 モードや日付は表示しないようにしなさい。

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

★練習問題(1916) ファイルの大きさの順に表示する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フィールドで行う。

★練習問題(1917) ファイルの行数の順に表示する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 コマンドでソートする。foreach か for で1つず つ wc コマンドを実行して、全体の結果を sort するか、引数 $* で wc した 後、sort して、合計(Total)の行を削る。

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

ps aux では、全プロセス(a)が、サイズなどの情報も含めて(u)表示される。
% ps aux  [←]
USER       PID %CPU %MEM      VSZ    RSS  TT  STAT STARTED      TIME COMMAND
root         1   0.0 -0.0    28340    540  ??  S<s   6Jun06   0:22.58 /sbin/laun
root        52   0.0 -0.0    27256    156  ??  Ss    6Jun06   0:00.00 /sbin/dyna
root        58   0.0 -0.2    30632   3536  ??  Ss    6Jun06   0:08.21 kextd
root        91   0.0 -0.0    28240    624  ??  Ss    6Jun06   0:00.03 /usr/sbin/
...
root        52   0.0 -0.0    27256    156  ??  Ss    6Jun06   0:00.00 /sbin/dyna
root        58   0.0 -0.2    30632   3536  ??  Ss    6Jun06   0:08.21 kextd
root        91   0.0 -0.0    28240    624  ??  Ss    6Jun06   0:00.03 /usr/sbin/
root        92   0.0 -0.2    28360   3624  ??  Ss    6Jun06   9:41.29 /usr/sbin/
% []
そのうち、メモリのサイズ(RSS)が大きいプロセスを 10 個だけ表示するシェル・ スクリプトを作りなさい。
% ps-rss-top10 [←]
USER       PID %CPU %MEM      VSZ    RSS  TT  STAT STARTED      TIME COMMAND
root       239   0.0 -0.9    62428  18316  ??  Ss    6Jun06   2:16.88 /System/Li
security 21102   0.1 -0.8   247056  15876  ??  S    Sat04PM   5:17.79 /System/Li
windowse 21096   0.1 -0.5   203808  11108  ??  Ss   Sat04PM   4:32.14 /System/Li
daemon     242   0.0 -0.4    73932   9280  ??  Ss    6Jun06   1:41.18 /System/Li
root       115   0.0 -0.4    39260   7920  ??  Ss    6Jun06   1:50.21 /System/Li
root       104   0.0 -0.2    34128   5100  ??  Ss    6Jun06   2:47.36 /usr/sbin/
root        92   0.0 -0.2    28360   3624  ??  Ss    6Jun06   9:41.81 /usr/sbin/
root        58   0.0 -0.2    30632   3536  ??  Ss    6Jun06   0:08.21 kextd
root       132   0.0 -0.2    31460   3372  ??  Ss    6Jun06   1:21.59 /usr/sbin/
root     21094   0.0 -0.1   205696   2924  ??  Ss   Sat04PM   0:00.19 /System/Li
ヒント:1行目は、そのまま表示する。 RSS の順(第6フィールド)に sort して head する。

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

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

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

emacs は、ファイルを保存する時に、1つの前のバージョンを「~」を 付けて保存する。そのようなファイルを見つけて、オリジナルのファイルと diff コマンドで比較するようなスクリプトを作りなさい。
% diff-backup *.c [←]
ヒント:foreach または for 文で、引数のファイルについて、 "$file"~ のような名前のファイルが存在するかを調べる。 存在すれば、diff コマンドで表示する。

余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停 止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ い。

★練習問題(1920) 小文字のファイル名への変更

Windows 系のコンピュータから Unix へファイルをコピーすると大文字のファ イル名になってしまうことがある。そのようなファイル名を全て小文字にする ようなスクリプトを書きなさい。

% mv-lower [A-Z]* [←]

ヒント:ファイル名を echo して、tr で小文字にして、それを `` でシェル変数に入れる。元の名前から小文 字の名前に mv で変える。

余裕があれば、大文字と小文字を変換することで、ファイルが上書きされる時 には警告を出したり、ユーザに問い合わせたりするようにしなさい。

★練習問題(1921) カウント・ダウン

秒単位でカウント・ダウンをするようなシェル・スクリプトを作りなさい。
% countdown 5 [←]
5
4
3
2
1
0
% []
ヒント:sleep 1 で、1ごとに止める。

★練習問題(1922) ファイルのn行目からm行目までの表示

引数として2つの数 n, m 、および、ファイル名を取り、そのファイルの n 行めから m 行目までを表示するシェル・スクリプトを作りなさい。 たとえば、次の例では、ファイルの 10 行目から 20 行目までを表示する。
% show-n-m 10 20 filename [←]

余裕があれば、-n オプションを付けなさい。これは、ファイルに行番号を振 るものである。nl コマンドを使うとよい。(cat -n が使えるシステムもある。)

■課題19 cshのエイリアスとシェル・スクリプト

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

(1) csh (tcsh) のエイリアスを定義しなさい。エイリアスは、~/.cshrc に保 存しなさい。定義したエイリアスについて、次のことを書きなさい。

授業で例題として示したものとは別のエイリアスを定義しなさい。

(2) 次のような条件を満たすシェル・スクリプトを作成しなさい。

作成したシェル・スクリプトを、ディレクトリ ~/bin に起きなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。

授業で例題として示したものとは別のシェル・スクリプトを作成しなさい。

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

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

(4) [加点] 制御構造 if, foreach, while, switch のうちいくつかを含むシェ ル・スクリプトを作成しなさい。この基準を満たしていれば、練習問題のうち の何れかを解いてもよい。


Last updated: 2009/06/22 18:24:11
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>