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

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

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

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

■連絡事項

■復習

■実行制御

シェルからプログラムを実行する時の方法。

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

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

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

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

◆順次実行

複数のコマンドを順次実行するには、「;」で区切る。
% date ; sleep 10 ; date; who [←]
Fri May 19 06:00:52 JST 2006
Fri May 19 06:01:02 JST 2006
yas      ttyp0    May 18 22:42 (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

■エイリアス(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 [←]
% []

◆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) という高機能のプログラムが広く使われている。

■実習

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

★練習問題(2001) 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 

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

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

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

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

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

/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 [←]
% []

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

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

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

The Unix Super Text 22.3節 参照

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

★練習問題(2007) システムプログラムの課題

情報学類3年生の科目 システムプログラム では、 シェルスクリプトに関する練習問題 が出されている。このうち、練習問題1009から1018を解いてみなさい。

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

締め切りは、2007年6月26日火曜日とする。 以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

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

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

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

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

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

(3) [加点] 制御構造を含むシェル・スクリプトを作成しなさい。


Last updated: 2007/06/22 11:27:17
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>