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

					2006年06月23日
コンピュータリテラシ

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

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

■連絡事項

■復習

■補足

レポート(紙の提出物)の注意点。

■エイリアス(alias)

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

■cshのエイリアス

コマンドに別の名前をつける。 長いコマンドラインを楽に打ち込むため機能。

例: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

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

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

◆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スクリプトの作り方

まず端末から実行してみる。 端末から打ち込んだものを結果を、ファイルに保存する。

% open /usr/local3/Applications/Gimp.app [←]
(^p で1行もどす。^a で、行頭に移動して echo と打ち、^e して > run-gimp と打つ)
% echo open /usr/local3/Applications/Gimp.app > run-gimp [←]
% csh run-gimp [←]
% []
tcsh の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 「|」があれば、 「'シングルクォート'」 でくくる。csh の引数にファイル名を与えて実行できる。

いちいち csh と打たないでもいいようにするには、chmod +x する。

% chmod +x run-gimp [←]
% ./run-gimp [←]
% []
ただし、この場合、csh ではなくて、sh (/bin/sh)で実行される。sh と csh は、文法に共通性もあるので、問題ない場合も多い。問題がある場合、どうし ても tcsh で実行させたい場合、テキスト・エディタで、行の先頭に 「#!/bin/csh」と書き、csh で実行させる。

#!/bin/csh
open /usr/local3/Applications/Gimp.app

数行にわたるものの場合、history コマンドを使う。

% history [←]
(ヒストリの表示して、何行必要か数える。history コマンド2回分多くtailコマンドに与える。)
% history | tail -5 > run [←]
% emacs run [←]
(最後の history コマンドや 番号、時刻などをテキスト・エディタで削る。)

「#!/bin/csh -f」と、-f を付けた方が、~/.cshrc を読み込まないので起動 が速い。ただし、~/.cshrc での設定(aliasなど)は効かないことがある。環境 変数は、今の状態が引き継がれる(~/.cshrc を読み込ませない方が都合がよい ことが多い)。

デバッグ

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

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

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

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

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

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

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

rehash の意味は、ハッシュ表を作り直すことである。path にあるコマンドは、 csh は、コマンドを打つたびに探すのではなくてハッシュ表に入れてそれを検 索している。

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

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

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

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

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

■木構造の制約と問題点

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

◆こうもりの分類問題

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

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

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

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

◆シンボリック・リンク/エイリアス/ショートカット

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

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

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

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

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

◆官僚制度の2つの見方

情報の流れには予算の流れも関連している。

◆官僚制度に見られる木構造の問題点

中間管理職の意味==横方向に情報が流れない。

木構造でしか情報が流れないような組織は、潰れる。木構造を補う意味で、会 社組織では、裏チャネルや同期会が重要となる。

◆外務省機密費問題

会計法違反。外務省に分かれた予算を首相官邸に流した。 国会の審議の意味がなくなった。

◆領土問題

木構造のどちらに付くか。

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

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

■シンボリック・リンク

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

例:cc と gcc-4.0

% ls -l /usr/bin/cc [←]
lrwxr-xr-x   1 root  wheel  7 Jun  6 17:31 /usr/bin/cc -> gcc-4.0
% []
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ れる。 ファイル /usr/bin/cc を参照すると、gcc-4.0 (/usr/binにある)が使われる。

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

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

■MacOSX alias

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

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

■実習

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

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

ls -l を使って、次のディレクトリにどのようなシンボリック・リンクがある かを調べなさい。

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

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

★練習問題(162) MacOSX エイリアスの作成

MacOSX のエイリアスを作成してみなさい。 その他に、コンテキスト・メニューで、「エイリアスを作成する」を選択する 方法もある。同じディレクトリに「○○のエイリアス」という名前で作成され るので、別の移動し、必要なら名前を変える。

◆課題19 tcshのエイリアスとシンボリック・リンク

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

(1) tcsh のエイリアス、または、シェル・スクリプトを作成しなさい。作成す る目的としては、コンピュータ・リテラシで用いたプログラムを簡単に実行す ることとする。どのプログラムを対象にしたのか、また、作成したエイリアス、 または、シェル・スクリプトをレポートに報告しなさい。

エイリアスは、~/.cshrc に保存しなさい。シェル・スクリプトは、ディレクト リ ~/bin 以下に起きなさい。

(2) ファイルに対するシンボリック・リンクを作成しなさい。作成する目的と しては、よく使うプログラムを簡単に実行できるようにすることや、自分自身 のファイルを整理する時に、木構造ではうまく行かない時にそれを補うために 使う。

(3) fj.unix.shells に 2006年6月9日から6月13日にかけて「いつも使う shell script」という Subject: を持つ記事を読みなさい。そして、その中から有用 だと思うものを1つ以上選び、そのシェル・スクリプトを自分で書きなさい(加 点)。


Last updated: 2006/06/24 02:27:29
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>