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/
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 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
$
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
$
~/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
$
シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 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
$
$1,$2,...
で参照できる。
$*
では、全ての引数を参照できる。
$#
で引数の数がわかる。
shift
コマンドで引数をずらすことができる。
$ set a b c
$ echo $1 $2
a b
$ echo $*
a b c
$ shift
$ echo $1 $2
b c
$ echo $*
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
$
The Unix Super Text 40.22.1 参照。
~/.bashrc
という名前のファイルにあるプログラムを自動的
に実行する。~/.bashrc
では、次のようなことを行う。
$ /usr/local3/coins/macosx/bin/emacs
$ /bin/ls
環境変数 PATH にディレクトリ名を登録しておくと、ディレクトリ名を省略す
ることができる。
例:
$ echo $PATH
(省略):/usr/local3/coins/macosx/bin:(省略):/bin:(省略)
$ emacs
$ ls
~/.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
に含まるように設定されて
いるので、各自設定する必要はない。
エイリアスとは一般に「別名」の意味。1つのものに2つ以上の名前をつける。
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
$
$ . ~/.bashrc
$
$ source ~/.bashrc
$
iTerm が開かない時には、Dock の Emacs で修正したり、Windows で修正する。
$ 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 を超えた時には、 不要なファイルを消す。
^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 参照。
ホーム・ディレクトリ ~
、デスクトップ ~/Desktop
や 書類
のディレクトリ ~/Documents
に、多くのファイルを放置することはよ
くない。ディレクトリを作成し、整理すべきである。
1つの目安は、ls コマンドで 1画面に入らない時には分割する。
コマンド名の置換え(alias)等て、rm を rm -i に変えることは、一般的には勧
められない。「rm -i y」という操作が、一連の操作として身に付い
てしまうので。
例:
何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。
ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。
ファイルのコピーでは、以下で述べるシンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。
大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。
図13 こうもりの分類(1)
図14 こうもりの分類(2)
木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。
注意:bash, csh の alias とファイル名の alias (Macintosh) は、まったくの別物。
図15 こうもりの分類(別名つき)
木構造を補う方法として、 ハイパーテキスト を使うことがある。
例: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
というファイルが使われる。(このファイルは、
newname
と oldname
の2つの名前を持つ。)
$ 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 は、次のような役割を持つ。
デスクトップは、MacOSX では、ホーム・ディレクトリの下の
「~/Desktop
」という名前のディレクトリに対応している。
注意事項
シンボリック・リンクとエイリアスの違い
$ ls
(タブ入りの表示、横)
$ ls | expand
(タブを含まない表示、縦)
$ ls -C | expand
(タブを含まない表示、横)
$
The Unix Super Text 35.2.7 exapnd、unexpand 参照。
$ 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/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
$
$ 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 コマンドでよく使うオプション
The Unix Super Text 35章 参照を参照して、フィルタを実行してみなさい。
$ 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 に間違いがある。
$ 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 コマンドが使える。
$ 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 と同じように、ファイル名の順に並べ替えなさい。
$ 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フィールドで行う。
$ 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 がある。
$ 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 によるページ単位の表示。)
$
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 の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。
$ 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
に追加する。
$ quota
$ quota -v
この結果と、 du コマンド の結果を比較しなさい。
$ du -s -k ~
(表示までに時間がかかる。強制終了したければ、^C)
$ cd ~
$ ls -R . | lv
$ ls -lR . | lv
$ ls -laR . | lv
-R
オプションは、このようにしばしば-l
オプションや
-a
オプションと一緒に使われる。また、-R
オプションは、大
量の結果を表示することが多いので、パイプに出力してページャで表示するこ
とが多い。
(これらのオプションを忘れた人は、man コマンドを見なさい。)
$ mkdir ~/dir1
$ ls ~/dir1
(最初は空)
$ cd ~/dir1
$ ls
(最初は空)
$ emacs file1.txt
$ ls
file1.txt
$ ls
(削除するファイルの確認)
$ rm file1.txt
(削除。成功すると何も表示されない。)
$ rm file1.txt~
(もし、「~」付きのファイルがあれば、削除。成功すると何も表示されない。)
$ ls
(ディレクトリが空であることの確認)
$ cd ..
(1個上のディレクトリに移動。)
$ ls ~/dir1
(ディレクトリが空であることの確認)
$ ls -d ~/dir1
(ディレクトリが存在すること確認)
$ rmdir ~/dir1
(ディレクトリの削除。成功すると何も表示されない。)
$ ls -d ~/dir1
(エラーが表示されることにより、ディレクトリが削除されたことを確認)
$
ls コマンドは、「.」から始まるファイル名を表示しない。ls コマンドに -a オプションを付けると、表示する。
ディレクトリを削除しようとした時に、ls コマンドで表示されないが、「.」 で始まるファイルがあるために、削除できないことがある。このことを確認し なさい。
$ mkdir ~/from_dir
$ mkdir ~/to_dir
$ cd ~/from_dir
$ echo 1 > file1.txt
$ echo 2 > file2.txt
$ echo 3 > file3.txt
$ ls *.txt
$ ls *.txt
(移動するファイルの確認)
$ ls ~/to_dir
(移動する先のディレクトリの確認)
$ mv *.txt ~/to_dir
(移動。成功すると何も表示されない。)
$ ls ~/to_dir
(移動した先のディレクトリの確認)
$ open ~/from_dir
$ open ~/to_dir
option キーを押しながらドラッグすると、移動ではなく、コピーになる。 このことを確認しなさい。
なお、コピーを行った後、元のファイルを消せば実質的に移動(改名)になる。
$ mkdir ~/dir1
$ cd ~/from_dir
$ echo 1 > file1.txt
$ ls
(ファイル名の確認)
$ mv file1.txt file2.txt
(改名。成功すると何も表示されない。)
$ ls
(ファイル名の確認)
名称未設定フォルダ
」という名前のフォルダが作成される。
$ ls -l /Applications | grep '^l'
ここで、'^l'
は、行の先頭がl
で始
まるという意味である。
The Unix Super Text 第32章 正規表現 参照。
$ lynx .
$ lynx ~
$ w3m .
$ w3m ~
(1) 練習問題(1908) から
練習問題(1918) まで
から2つ選んでシェル・スクリプトを作成しなさい。
作成したシェル・スクリプトを、ディレクトリ ~/bin
に起きなさい。
作成したシェル・スクリプトについて、次のことを書きなさい。
(2) quota コマンドを実行しなさい。大きなファイルを cp コマンド等でコピー しなさい。その後、再び、quota コマンドを実行しなさい。コピーの前後で数 字が変化した部分と変化しなかった部分がある。変化した部分は、何を意味す るのか説明しなさい。変化しなかった部分で、重要な数字を1つ選び、何を意 味するのか説明しなさい。
(3) mkdir, rm, ln -s 等のコマンドや Finder を用いて、ファイルを整理しなさい。 レポートには次の項目を含めなさい。
ディレクトリ構成の説明には、tree コマンドの結果を利 用してもよい。ただし、今回整理した部分だけを含めること。~/Library/ など、 自分では整理しなかったファイルについては、含めないこと。
課題が出される前に既にディレクトリを作成して既に既に整った状況であった 場合には、問題点の代わりに整理の考え方について説明しなさい。またディレ クトリを新たに作成する代わりに既存のディレクトリについて報告してもよい。
(4) [加点] ~/.bashrc に対してエイリアス、シェル変数、または関数を2つ定 義して追加しなさい。定義したものについて、それぞれ次のことを書きなさい。
(5) [加点] The Unix Super Text の次の部分を読みなさい。
tee, uniq, tr, expand, sed, awk