Play on Unix.
Under Construction.
telnetクライアントであるTeraTermProのことから話題を始めてtelnetで出来ることに話を持っていって、んでもって何れはperlスクリプトのことにも突っ込んでいこうかという内容です。可能かどうか判りませんが。
まず最初はTeraTermProの設定を全てやっておきましょう。TeraTermProはtelnetクライアントなわけですが、telnetでは文字ベースで全てやりとりされるので何よりもまず設定をしておかないと表示すらままならなくなります。設定はメニューの「Setup」から行います。「Terminal...」、「Window...」、「Keyboard...」、「TCP/IP...」、「General...」の項目があります(他の項目は特に扱いません)。それぞれを1トピックにして順に説明します。
「Terminal...」
まずはメニューから選びましょう。ウィンドウが表示されます。ここでで設定する内容はおおよそ決まりきっています。左上の「Terminal size」には表示される文字数を指定します。横方向の文字数は80にしておくのがいいでしょう。縦方向にはお好きな数字をどうぞ。その直下、「Term size = win size」はチェックしておきます。「Terminal ID」は「VT100」というのを選んでおきます。右上の方に行って「New-line」。2つのドロップダウンコンボボックスがありますが、ここは両方ともCRにしておきます。次に一番下。「Kanji (receive)」と「Kanji (transmit)」。ここもそれぞれコンボボックスがありますが両方ともEUCを選んでおきます。CRは文字コード13を記号的に表現した内容でcarriage returnのアクロニムです。EUCはUNIXの世界で使用されている文字コードの名称でextended unix codeからきています。
「Window...」
選ぶと例によってウィンドウが表示されます。真ん中くらいに「Scroll buffer」というのがあります。このチェックボックスはチェックしておいてください。これで文字ベースの通信ソフトのように画面に表示された文字がバッファに蓄えられて、スクロールによって表示内容を過去に遡ることが出来るようになります。またその右隣のエディットボックスでは行数を指定します。何行分のバッファを確保するかを指定します。残りの項目は自由に設定してください。
「Keyboard...」
小さいウィンドウが表示されます。ここは好みでチェックしましょう。「Backspace key」、「Delete key」共にチェックしてもしなくても動作はしますが、チェックしておいた方が便利でしょう。
「TCP/IP...」
上にエディットボックス、その下にリストボックスがあります。ここでは頻繁に接続するホスト名を指定しておきます。ISPから送られてきた資料からtelnetのホスト名を探してここに指定しておきましょう。指定方法はエディットボックスにホスト名を入力して「Add」ボタンを押せばOK。ボタンを押すと下のリストボックスにそれが入ります。下の「Auto window close」は好みでチェックしてください。チェックしておくと、サーバとの接続が切れた時に自動的にTeraTermProを終了します。接続先が1つしかない人はチェックしておくと良いでしょう。複数の接続先がある人はチェックしないでおく方が良いでしょう。右の「Port #」は23です。telnetではポート番号は23と決まっています。左下の「Telnet」はチェックしておきます。右の「Term type」はvt100です。
「General...」
上のコンボボックスではTCP/IPを選びます。下は当然Japanese。おしまい。TCP/IPはあちこちでよく見かけるキーワードでしょう。transport control protocol/internet protocolです。よくTCPという風に略して言うこともあります。伝送制御プロトコルと言われています。仲間にUDP(user datagram protocol)なんていうのもあります。
以上で設定終了。後はこの設定をファイルに保存しておきます。メニューから「Setup」->「Save setup...」を選びます。見慣れたウィンドウが表示されます。ファイル名や保存場所等は特に必要がない限りは変更しないでください。ただ「保存(S)」ボタンを押すのみ。ここまで来たら後はすぐにでも使えるようになっています。
接続
では早速接続しましょう。まずは先に自分でdialupしてISPと接続しておきます。接続が済んでいればTeraTermProをいつでもホストと接続出来ます。接続するにはメニューから「File」->「New connection...」を選びます。ウィンドウが表示されます。次回起動時からはTeraTermProを起動するだけで自動的にこのウィンドウが表示されます。「Host」コンボボックスに接続したいホスト名が表示されていることを確認します。違うのであればコンボボックスをドロップダウンさせて選ぶか、或いは直接キーボードでタイプしてもOKです。
さてどうでしょうか。TeraTermProの画面に何か表示されたらとりあえず接続は成功していると思います。ホストが混雑していれば当然なかなか表示されません。そのままで少し待ってみましょう。ここからは接続された内容として話をすすめます。
最初に何やらよく判らない内容が表示されます。これの意味は判らなくても問題ありません。判ってもさほど役に立ちませんし:D 次にlogin:とプロンプトが表示されて、入力待ちになっているはずです。ここではユーザ名を入力します。ユーザ名はdialup時のユーザ名と同じというケースが多いと思います。この辺はISPによって違うのでISPからの資料にそれらしき内容が書いてないか調べてみましょう。もし書いていなければdialup時のユーザ名をそのまま入力すればOKだと思います。次にPassword:と来るはずです。読んで字の如しですね。パスワードを入力します。パスワードもユーザ名と同様にtelnet専用のそれがISPより発行されているか、或いはdialup時のそれがそのまま使えるケースのどちらかだと思います。パ
間違っていなければLast login:〜等と表示されると思います。表示される内容はISPが使っているOSによって異なります。あまり神経質になる必要はありません。プロンプトが表示されて入力待ちになったらログイン成功です。尚、ユーザ名とパスワード入力の場面では入力を間違っても再度ユーザ名とログイン名をきいてくるのでもう一度その時に入力し直せば大丈夫です。ただし、何度でも入力し直しが出来るわけではありません。どこのISPでも必ず制限を設けています。一定時間内にログインに成功しないと強制的に切断するホストもありますし、3回ログインに失敗すると切断するホストもあります。
さて、成功したらとりあえず
ls -la
とタイプします。最後にリターンキーも押します。
どうでしょうか。何か表示されました? あなたは今UNIXの標準コマンドであるlsコマンドを実行したことになります。lsコマンドはDOSで言うところのdirと同じようなコマンドです。今現在いるディレクトリの内容を表示したというわけです。カレントを確認したい時はpwdを実行します。DOSと違ってドライブという内容はありません。全てディレクトリ階層で表示されます。ディレクトリの移動にはcdを使います。ファイルの削除はrm、ファイルのコピーはcp、ディレクトリ作成はmkdir、ディレクトリ削除はrmdirという具合に全てコマンドを入力することで目的の操作を行っていくことになります。で、ログアウトするにはexitとすればOK。或いはCTRL+Dでもログアウト出来ます。
以上、ここまでの内容は自分でHPを作っていて自分でサーバにHTMLファイルを放り込んできた人にとってはおそらくご存じの方も多いでしょう。
基礎知識
ログインした直後に居るディレクトリはホームディレクトリと呼ばれます。ユーザの数だけホームディレクトリが存在します。通常だとログイン直後はホームディレクトリがカレントになります。これから行う様々なことは基本的にどのディレクトリにおいて行っても構いませんが、必ず自分のホームディレクトリ傘下で行うようにします。他のユーザのホームディレクトリにちょっかいを出してはいけません。ISPと契約したということは、ISPが設置しているサーバのディスクを間借りしているということなのです。あなたが間借りして使えるスペースはあなたのホームディレクトリ傘下だけです。
HPを公開するには通常HTMLファイルを置く場所を確保しなければなりません。よくあるパターンとしてホームディレクトリ傘下にpublic_htmlというディレクトリを作成し、その傘下にHTMLファイルを置くことになっています。ここで必要な操作はディレクトリの作成です。pwdでカレントがホームディレクトリであることを確認したら以下のようにします。
mkdir public_html
これでmkdirの後に指定したディレクトリがその場に作成されているはずです。lsで作成されていることを確かめてみましょう。この例でmkdirの後に作成したいディレクトリ名を指定すればよいことが判ると思います。
ディレクトリを作成したのでそこに移動してみます。
cd public_html
カレントが移動したことを確かめておきましょう。HTMLファイルはこのディレクトリ傘下に置くようにします。もう1つディレクトリを作ってみます。
mkdir cgi-bin
cd cgi-bin
カレントがcgi-binに移動していることを確かめたら、そのディレクトリから出てみます。
cd ..
例によってカレントを確かめます。2つのピリオドは「親ディレクトリ」です。もう一度同じことをすればホームディレクトリに戻ります。やってみましょう。さて、ディレクトリ深くに移動する際には1つずつ入って行かなくても1度に移動できます。
cd public_html/cgi-bin
/で区切っていくつでもディレクトリ名を連ねて指定できます。親ディレクトリに戻るときも同様です。
cd ../..
これで親の親に戻ります。色々試してみましょう。例を少し挙げておきます。
cd public_html/images
cd ../cgi-bin
cd ~
cd ~/public_html
~記号はホームディレクトリを意味します。3番目の例はホームディレクトリへ移動、4番目はホームディレクトリ下のpublic_htmlに移動します。このくらいで充分でしょうか。ディレクトリを削除するにはpublic_htmlをカレントにして
rmdir cgi-bin
これでOK。ディレクトリの削除はそのディレクトリ傘下が空になっていないと出来ません。ディレクトリ傘下に何かのファイルやディレクトリがあると削除できません。内容は試し。ちょっとファイルが存在するディレクトリの削除をやってみましょう。もう一度cgi-binディレクトリを作成してそこに移動します。移動したら
cat > test.txt
と入力します。すると何故かいつものプロンプトが表示されずに入力待ちになります。ここで適当な文字を好きなだけ入力してください。リターンキーを押して改行してもOKです。でたらめでいいので適当な文字を入力してください。気が済んだら最後にCTRL+Dを入力します。これでいつも通りのプロンプトに戻ります。さてファイル一覧を表示してみましょう。どうでしょうか。test.txtというファイルが出来ています。更に
cat test.txt
としてみます。先ほどあなたが入力した内容が表示されると思います。細かいことは気にしないで親にカレントを移してcgi-binディレクトリを削除してみましょう。今度はどんなもんでしょうか。
rmdir: test: Directory not empty
とかなんとか表示されると思います。ディレクトリの中身が空でないので削除出来ないと言ってきたのです。ならばtest.txtを削除しましょう。cgi-binに移動して
rm test.txt
を実行します。これでファイルが削除されました。親に移動してもう一度cgi-binを削除してみましょう。
cd ..
rmdir cgi-bin
今度は何も言われないはずです。ファイル一覧を表示させてcgi-binがなくなっていることを確認しましょう。ファイルやディレクトリの削除はやり直しがきかないので慎重に行うようにしましょう。
さて先ほどのcatコマンドですが、コレは一体何でしょうか? cat test.txtを実行した時はtest.txtの内容を表示しました。正しくは、指定されたファイルの内容を標準出力に出力した、となります。標準出力とは通常はディスプレイのことだと思ってください。プログラムが標準出力に文字を出力すると、それはディスプレイに表示され私達が目にすることが出来るようになります。標準出力があるのなら標準入力もあると考えるかもしれません。あります。標準入力とは通常はキーボード入力のことだと思ってください。先ほどのtest.txtの一件、ピンときた方は賢いです。
catコマンドは標準入力をそのまま標準出力に送り出すというコマンドです。ただそれだけのことしかしません。標準入力を標準出力に送ると言うことはキーボード入力をディスプレイに出力すると読み替えることが出来ます。試しに何も指定せずにcatコマンドを実行します。入力待ちになるはずです。キーボード入力を(標準入力を)catコマンドが待っているのです。リターンキーを押すとそれまで入力した文字がオウム返しで表示されます。つまりcatコマンドがディスプレイに出力した(標準出力に出力した)わけです。あなたが入力した文字はリターンキーを押すと標準入力としてcatコマンドに送られます。全て文字で送られます。改行コードが1行の終わりとして標準入力に送られるわけです。何度でもオウム返しで表示します。気が済んだらCTRL+Dを入力します。これで標準入力が終わります。CTRL+DはEOF(end of file)です。ファイルがここで終わりなので、標準入力が送る文字もこれにておしまいとcatコマンドに告げます。
つまりcatコマンドは標準入力をファイルリードとしてとらえているのです。反対に標準出力はファイルへのライトとして行っています。
さて、test.txtの一件ですが、何故あのときはあなたの入力をオウム返しで表示しなかったのかを説明しないといけません。あの時は
cat > test.txt
を実行しました。答えはリダイレクトしているからです。この>がリダイレクトを指示しています。>はリダイレクト記号です。リダイレクト記号には<と>の2つがあります(本当は他にもまだありますが)。ここでは>を使っています。リダイレクトすると何がどうなるのかというと標準入力や標準出力を変更出来ます。先ほどの説明でこれらは通常はキーボード入力とディスプレイであると言いました。リダイレクトするとこれらの前提を変更できるのです。>記号は標準出力を変更し、<記号は標準入力を変更します。これらの記号の後ろに変更先を指定します。上記のコマンドではcatコマンドの標準出力先を通常のディスプレイからtest.txtというファイルに変更したのです。つまりオウム返しする内容はディスプレイではなく全てtest.txtファイルへ出力されていたのです。これでcat test.txtを実行した時の謎が解けたでしょうか。あなたが入力した内容が全てtest.txtファイルに書き込まれていったのです。
試しに今度は標準入力をリダイレクトしてみましょうか。先ほどと同じ手順でtest.txtファイルを作成してください。作成したら
cat < test.txt > test2.txt
こんなことを実行してみます。どういう操作をしたことになるのか考えてみましょう。標準入力をtest.txtに変更して、標準出力をtest2.txtに変更しています。catコマンドは標準入力からリードした内容を標準出力にライトするわけですから、test.txtをリードしてそれをtest2.txtへライトすることになります。つまりtest.txtがtest2.txtという名前で複製されたことになります。ファイル一覧を表示してtest2.txtというファイルが出来ていることを確かめてみましょう。
cat < test.txt2
これだと標準出力はディスプレイのままで変更されていないのでtest.txt2からリードした内容が表示されることになります。鋭い人は気が付いたかもしれませんが以下の2つは同じことを行っています。
cat test.txt
cat < test.txt
catコマンドはファイルが指定された時(1行目の例)はそれを標準入力としてリードしてくれます。
これまでに幾度となく標準入力、標準出力という言葉を用いてきました。cgi(common gateway interface)プログラムを作ったことがある方なら判るかと思いますが、cgiプログラムもこの標準入力、標準出力を利用して作られています。プログラミングをする場合には標準入力をstdinとかSTDIN、標準出力をstdoutとかSTDOUTという風に表します。それぞれstandard input、standard outputを縮めたものです。
さて、次はpermissionの話。読むときはパーミッションでしょうか。パミッションという風にのばさずに言う方が英語の発音には近いかな。一度ホームディレクトリに移動してください。そこでls -laを実行します。一覧が表示されますが、ここでdrw-rw-rw-とかいう意味不明な内容が一緒に表示されていると思います。これがpermissionです。例えばpublic_htmlのpermissionはどうなっていますか? 試しにtestというディレクトリを作成して、そのpermissionを確かめてみてください。おそらくdrwxr-xr-xという風になっているのではないかと思います(違う場合もあります)。まずはpermissionの見方から先に説明しましょう。permissionを見るときは1文字、3文字、3文字、3文字で区切って見るようにします。
d rxw r-x r-x
本当は一番左の1文字はpermissionではないんですが、この際なので一緒に説明します。一番左の文字がdの場合は、それはディレクトリであることを意味します。普通のファイルであればマイナス記号になります。dと-以外の文字もあるのですが、それらは何れ説明しましょう。残りのpermissionの部分はオーナであるユーザ、グループユーザ、その他のユーザの、そのファイル或いはディレクトリへのアクセス権限を表しています。ここでまた覚えなければならない言葉が出てきました。何故ユーザが3種類もあるのか? telnetを使う際に一番最初にユーザ名とパスワードを入力したはずですが、あれはこれからUNIXを使おうとしている人が誰なのかを区別するために行っています。WWindowsでもユーザを区別するようになっていますよね。
で、ここでユーザの種類が出てきます。ログインすると最初はホームディレクトリに居ます。このホームディレクトリ傘下はISPと契約したあなたが間借りしているディスクスペースであると説明しました。つまりホームディレクトリ傘下のファイルやディレクトリは契約したあなたがオーナということになります。あなたのファイルやディレクトリです。これがpermissionの最初の3文字にあたります。要するにオーナとはログインしたあなたのことを意味します。以降owner userやowner等と表すことにします。
次にグループユーザ。UNIXでは開発作業等のために、その開発にあたる複数の人をグループという1つの単位で扱えます。班という風に解釈してもいいかもしれません。このグループに属しているユーザのpermissionを表すのが2番目の3文字です。以降group userと表します。
最後のその他のユーザは、言葉のまんまで全くの第三者、赤の他人です。これはユーザとしてアカウントが用意されていない人です。その他のユーザという風に書いてきましたが、以降nobodyと表すことにします。
現時点ではまだそれほど詳しく説明しません。また、ISPに接続してUNIXを利用している限りにおいてはgroup userは事実上さしたる意味をなしません。覚えておく必要があるのはownerとnobodyです。ではpermissonが表す各文字の意味を説明しましょう。文字はr、w、xの3種類があります。それぞれread、write、executeを表しています。readとwriteはおそらくすぐに判るでしょう。そのファイルやディレクトリへの読み出し、書き込みが出来るかどうかを意味します。read属性があればそのファイルを読み出したりすることが出来ます。HTMLファイル等はこのread属性がないと見ることが出来ません。またwrite属性はそのファイルやディレクトリの書き込み属性なので、write属性があればファイルに変更を加えたり、削除が出来ます。ディレクトリを削除する時にもこのwrite属性が必要です。
さて、execute属性が一番説明が必要です。executeというのは実行可能属性です。そのファイルが実行可能かどうかを表します。つまりプログラムには必ずこの属性がついていなければなりません。実行可能属性がついていないと実行できないのです。MS-DOSやWindowsでは拡張子が.COM、.EXE、.BAT、.PIFであれば実行可能ファイルであるという風に判ります。しかしUNIXの場合には特に拡張子は必要ありません。むしろ通常だとプログラムには拡張子は付けません。実行可能なファイルであるかどうかは全てこのexecute属性によって見分けられます。
execute属性はディレクトリにも付けられます。実行可能属性が付いているディレクトリとはどういうディレクトリでしょうか? ディレクトリの場合のexecute属性はそこに移動できるかどうかを意味します。つまりディレクトリ内に入れるかどうかです。execute属性の付いていないディレクトリには入ることが出来ません。
さて、ここで先ほど表示されたpermissionを見てみましょう。testというディレクトリのpermissionです。今まで説明してきたことを加味すれば、testはディレクトリで、ownerが読み出し、書き込み、及び入ることの出来るディレクトリ(rwxの部分)で、group userの人は読み出しと入ることだけが出来て(次のr-xの部分)、nobodyの人も読み出しと入ることだけが出来る(最後のr-xの部分)ディレクトリということになります。このディレクトリの書き込み属性が付いているのはownerだけです。つまりこのディレクトリの削除が出来るのはあなただけです。もしgroup userやnobodyも削除できるようにしたいのであればd rwx rwx rwxというpermissionになっていなければなりません。或いはgroup userとnobodyには一切何もさせないようにするのであればd rwx --- ---というpermissionでなければなりません。
public_htmlの場合を例にしてみましょう。このディレクトリは通常ホームページとして公開する各種ファイルを置くディレクトリです。このディレクトリのpermissionはどのように設定すべきでしょうか。まずホームページの管理者であるあなた、つまりownerには当然ながら全ての属性がついていないと困ります。group userはISPでUNIXを使っている際には意味をなさないので全く何の属性も必要ありません。問題はnobodyです。ホームページは一部の例外を除いて普通は誰でも見れるものです、というか見てもらうために公開しているわけですよね。そのISPと契約している人しか見れない等というのでは意味がありません。つまりはownerでもgroup userでもなくnobodyが見れないと意味がありません。そのISPのサーバにアカウントがない人、要するにあなたのホームページを見に来る人の大部分はnobodyです。ということは、nobodyの属性としてexecute属性が必要ということになります。nobodyがpublic_htmlディレクトリに入ることが出来ないとホームページが見れません。ですからd rwx --- --xのpermissionが必要ということになりますね。permissionを変更するにはchmodコマンドを使います。
chmod 701 public_html
701というのが与えるpermissionです。ここでは7がowner、0がgroup user、1がnobodyに与える属性を表しています。permissionはそれぞれ数字で指定するわけですが、これがちょっと判りにくいかもしれません。3文字の属性を2進数で考えてみましょう。オーナのユーザに対するrwxをから行きましょうか。一番右の属性は1の位、真ん中の属性は2の位、一番左の属性は4の位として考えます。この場合はrwxと全ての属性があるので各属性の位を足し算します。ここでは4+2+1で7になります。グループユーザはどの属性もないので0です。nobodyは--xで、実行可能属性(1の位)だけがあるので1になります。これがもしr-xなら4+1で5になります。或いはrw-なら4+2で6になります。
今はディレクトリに対してpermissionを指定しましたが、ファイルに対しても全く同様に指定できます。あなたならHTMLファイルにどのようなpermissionを指定するでしょうか。私なら
chmod 604 index.html
と指定します。このpermissionがどういう意味なのか悩んでみて下さい。
そろそろ具体的に何かを...
してみたいですよね。読むばっかりだとつまらないし、ここらで簡単に出来ることを何かやってみよう...と考えたはいいけど、何があるかな? ま、メールのフォワードから行ってみましょうか。メールのフォワードとは転送のことです。引越をすると郵便局に郵便物の転送の願いを出しますよね。アレと似たような内容です。この転送のことをフォワード(forward:転送)と言っています。転送を設定するにはメールサーバ上のホームディレクトリ直下にテキストファイルを用意することで行えます。ファイル名は.forwardで、このファイルの内容として転送先のメールアドレスを書いておきます。つまり.forwardファイルの中身をabc@def.ne.jpとしておけば、そのアドレス宛に転送されます。たったこれだけで転送は設定できます。では具体的にどのような作業をすればこのようなファイルを用意したり出来るでしょうか?
1つにはローカルマシン(local machine:あなたが使っている端末)でそのような内容のテキストファイルを作成してftp(file transfer protocol:ファイル転送プロトコル)でサーバに放り込む方法がありますね。でも、ここで用意しようとしているファイルはわずか1行あまりの非常に小さなファイルです。わざわざファイル転送を行うのもちょっと大げさな感じがします。そこで先程説明したcatコマンドを使ってみましょうか。どうすれば良いか思いつきますか? ホームディレクトリで以下のコマンドを実行してみてください。必ずホームディレクトリでやってください。
cat > .forward
これで入力待ちになるはずです。以前説明したとおり、標準入力をcatコマンドが待っています。ここで転送先のメールアドレスを入力します。入力したらCTRL+Dで入力を終了させます。さてどうでしょうか、ファイルが出来ていることを確認しておきましょう。ファイルの中身が思惑通りかも確認しておきましょう。どうすれば良いかはもうお判りですね。
さて、これにて転送の設定はおしまい。判ってさえしまえば簡単です。試しに今のアドレス宛にメールを出してみてちゃんと転送されるかを確かめてみてください。shell accountのないISPと契約している人はこの転送をしたい場合にはISPに依頼しないといけません。shell accountがあれば自分で出来てしまいます。あ、そうそう、.forwardのpermissionを念のため設定しておきましょう。このファイルのpermissionにはowner userだけ属性が設定されていれば充分です。読みとりと書き込みの属性があればOK。group userとnobodyには何の属性も必要ありません。転送を止めたければ.forwardファイルを削除すればそれでOK。ファイル名を他の名前に変えておくっていうのでもOKです。注意点としては既に書きましたが、.forwardファイルを必ずホームディレクトリ直下に置くということです。他のディレクトリではダメなのです。
もう1つ言うのを忘れていましたがMS-DOS等とは違ってUNIXではアルファベットの大小文字をバッチリ区別します。通常は小文字を使います。大小どちらでも同じだろうと思って大文字で入力したりするとうまくいかないので注意しましょう。
ファイルの表示
catコマンドを割と使ってきたのでファイルの表示はもう結構大丈夫ではないかと思いますが...が、しかし、本当に大丈夫でしょうか? 試しにHTMLファイル等を表示してみましょう。果たしてマトモに表示できるでしょうか? 日本語を使っていると多分表示がおかしくなると思います。でも場合によりけりです。これには文字コードという深い問題が絡んでいます。ここから先はいきなり覚える内容のボリュームが増えるので慎重に読み進めてください。
文字コードですが、UNIXの世界ではEUC(extended unix code)と呼ばれるコードが使用されています。多分ブラウザやホームページ等で幾度となく見かけたことがあるキーワードかと思います。MS-DOSやWindows等ではEUCは使われていません。ですからHTML等は多くの場合ShiftJISで書かれていると思います。シフト・ジスと読めば良いかな。これも文字コードです。よくSJISと略して表すことがあります。元々はMicrosoftが日本語文字を表せるように考え出したMS-KanjiCode(だったかな?)という内容があって、それが色々あってSJISと呼ばれるようになりました。で、HTMLファイルがSJISだったりするもので、EUCに設定されているTeraTermProではマトモに表示されません。TeraTermProをSJISにするという手もなくはないんですが、UNIXを使う以上EUCになっていた方が便利なんです、というかEUCでないと困る場面があります。で、TeraTermProをEUCに設定したまま何とかSJISのHTMLファイルを表示させたい時にはどうしたものでしょうか?
実はEUC、SJIS、JISの間で文字コードを変換できるプログラムが世の中には既にあったりなんかするんです。ここで言うJISも文字コードのJISです。JIS規格のJISではなくて...いや、JIS規格のJISなんですけどね。 本当はもっと覚えにくい名前なんですが通常JISコード等と呼ばれる文字コードがあって、それのことを表しています。で、これらの相互変換が可能なプログラムが既に先人達の手によって作られています。nkfというプログラムがそれです。で、このプログラムがあればSJIS→EUCの変換をさせることでTeraTermProで正常に表示できるというわけです。さてあなたが契約しているISPのサーバにはnkfが入っているでしょうか? とりあえずは以下のようにタイプしてください。
nkf < abc
この時に以下のどちらかの表示になると思います。
abc: No such file or directory
nkf: Command not found.
どちらが表示されましたか? 上の表示であればnkf自体はISPのサーバにインストールされています。もし下の表示ならISPのサーバにはインストールされていません。
nkfがインストールされていない人はftp
というわけで、ここではnkfをどこから入手してくるかを説明しましょう。nkfがインストールされている人は読み飛ばしてもOKです。
nkfというプログラムは北大のサーバにあります。北海道大学ね。つーわけで、この北大のftpサイトからnkfを有り難く頂いてまいりましょう。と思いきや、ついこのあいだ北大のftpサイトを覗いてきたら既にありませんでした。で、代わりに他のサイトに転がっていないか調べてきました。さて早速と行きたいところですが注意が1つ。勘違いしてはいけないのはローカルマシンではなくISPのサーバ上にダウンロードしてくるという点です。ローカルマシンにダウンロードしても大部分の人にとってはおそらく役に立ちません。ISPのサーバ上に、それもあなたのホームディレクトリ傘下にダウンロードしないと意味がありません。これからダウンロードしようとしているのはすぐさま実行できるプログラムではなくて、そのソースファイルです。ソースファイル(source file)って言ってもピンとこないかもしれませんが、プログラミング言語で書かれたテキストファイルをこのように言います。ソースファイルは単なるテキストファイルなのでプログラムではありません。これを元にして実際に実行できるプログラムを作らないといけません。あ、思わず腰がひけてしまったあなた、大丈夫、言うとおりに作業すればプログラミングの知識は全く要りません。間違いなく操作を行うことだけに気を付けていればちゃんと出来ます。
さて、まずはお目当てのftpサイトからソースファイルをダウンロードしてきましょう。ホームディレクトリにいることを確認したら以下のようにします。
ftp
すると普段とはちょっと違うプロンプトが表示されると思います。こんな感じです。
ftp>
ftpというのは前にちょっと書きましたがfile transfer protocolを略した内容で、ファイル転送プロトコルと呼ばれています。その名の通り、ファイルを自分の所にダウンロードしたり逆に接続先の相手にファイルを置いたりする時に使用します。今入力したftpはこのファイル転送をやってくれるUNIXのプログラムです。ftp>と表示されたのはftpプログラムがあなたからの指示を待っていることを示しています。ここでもftp用のコマンドを入力して操作していきます。では早速行きましょう。まずはサーバに接続します。
open ftp.tut.ac.jp
アドレスを間違えないようにしましょう。openコマンドは指定されたアドレスのホストに接続を行います。
Connected to ftp.tut.ac.jp.
このように表示されたらOKです。
Name (ftp.tut.ac.jp:なんとか):
今度はこんな風に表示されます。ユーザ名を入力するのですが、ここでは匿名で入るので
Name (ftp.tut.ac.jp:なんとか):ftp
と入力します。単にftpと入力すればOKです。次にパスワードを入力します。
Password:
ここではパスワードを入力するのですが、今は匿名で入ろうとしているので代わりにメールアドレスを入力します。ここで入力する内容は画面には表示されません。
うまく入れたでしょうか? ここのftpホストは匿名でのログインを許可しているので本来必要となるはずのユーザ名とパスワードは必要ありません。ユーザ名のところでftpと入力しましたが、もしユーザ名ftpでうまく入れなければ代わりにanonymousと入力してください。anonymousとは匿名という意味です。さてそれでは実際にダウンロードを始めましょう。
cd .h3/UNIX/bin
bin
get nkf-1.4.tar.gz
と順に入力します。cdで目的のファイルが置いてあるディレクトリへと入っていきます。binはbinary転送を指示しています。getで実際にファイル転送をしますが、getの後に指定するファイル名は間違えないように気を付けましょう。nkfの直後はマイナス記号です。これでダウンロードを開始しています。
xxxx bytes received in x.x seconds (x.x Kbytes/s)
等と表示されたらダウンロード終了です。ftpはこれで終了します。
bye
byeと入力するとftpが終了します。nkf-1.4.tar.gzというファイルがちゃんとあることを確認しておきましょう。確認したらpermissionも。ownerにr--の属性があればOKです。
さて、今ダウンロードしてきたファイルは1つにまとめられています。本来は複数のファイルなのですが、ダウンロードに便利なように1ファイルにくっつけてあります。ついでに言うと、くっつけてあるだけではなく圧縮もされています。これを元通り複数のファイルに戻しておかないといけません。そこで以下のようにします。
gzip -dc nkf-1.4.tar.gz | tar xf -
コマンドの詳しい意味は今は説明しません。しかし覚えておくとメリットは結構大きいと思うので何れ説明します。滞りなく実行が完了すれば、本来の複数ファイルの状態で解凍されているはずです。tarの直前にある縦棒みたいな文字はキーボードの右上の方にあります。この文字はパイプという風に呼ぶことがあるそうです。また、tarの後にあるxfと-の間はスペースが入ります。終わったらちょっとls -laでディレクトリ内を見てみてください。新しくディレクトリが作成されていると思います。そこに移動してください。
するのですcd nkf-1.4
どんなファイルがあるかを見てみましょう。nkf.cとかMakefileとかっていうファイルがあるはずです。nkf.cというのがnkfというプログラムのソースファイルです。C言語で書かれています。Makefileもテキストファイルで、このファイルは名前通りメイクファイルと呼ばれます。メイクファイルにはどのようにしてプログラム作成を行うのかといった、プログラム作成の手順が書かれています。さて、肝心のプログラムそのものはありません。今からnkfというプログラムを作成するのです。
いざプログラム作成
に進む前にちょっと注意。プログラム作成にはコンパイラ(compiler)と呼ばれるソフトを使用します。このコンパイラはCPUを酷使するソフトなので出来るだけ利用人員の少なそうな時間帯を見計らって行うようにしてください。コンパイラを動かすとサーバの負荷が極端に上がります。サーバはそのISPの会員全員が利用する資源なので、なるべく他のユーザの迷惑にならないよう配慮しましょう。
では早速。
make
はい、終わり:D makeコマンドはメイクファイル(Makefileというファイル)に書かれている手順に従ってプログラム作成を行ってくれるプログラムです。時間がかかるかもしれないのでちょっと待ってみてください。終わったらnkfというファイルが出来ていると思います。このファイルのpermissionを確認してみましょう。xの属性が付いていませんか? これが実行できるファイルであることを示しています。今あなたはC言語というプログラミング言語で書かれたソースファイルをコンパイル(compile)して実際に実行できるnkfというプログラムを作成したことになります。これでnkfが手に入りました。まずは作成されたnkfをホームディレクトリにでもコピーしておきましょう。ファイルコピーにはcpコマンドを使います。~がホームディレクトリを表すということを思い出しましょう。
cp nkf ~/
これでコピー完了。本当は最後の/は不要なのですが、これは単に私の習慣です。もしコピー先では名前を変更したいのであれば
cp nkf ~/abc
等と入力します。これでコピー先のファイル名はnkfではなくabcになります。ついでにプログラムのpermissionを変更しておきます。ownerの全属性を指定します。group userとnobodyには全く何の属性も必要ありません。
nkfを使ってみる
早速ホームディレクトリで実行してみましょう。使い方はこんな感じです。
./nkf -e public_html/index.html
-eというのはEUCへの変換を意味します。-eの後ろは表示したいファイル名です。先頭に./というのを付けていますが、これは今居るディレクトリを意味します。うまく表示されたでしょうか?
表示されたのはいいが、スクロールしてしまってちょっと目が追いつかないかもしれません。MS-DOSの場合にはmoreというフィルタ(filter)を使って表示を一旦停止出来ますが、UNIXでも同じことが出来ます。
nkf -e public_html/index.html | more
これでどうでしょう? 今度は一旦停止します。続きを表示させたければスペースキーでも押してください。次に進みます。パイプ記号(縦棒)の謎についてはまた今度。
パイプ(1998/2/21)
例の縦棒ですが、あれはパイプという機能を使った内容です。パイプとはあるプログラムの標準出力を別のプログラムの標準入力につなげる機能のことです。ちんぷんかんぷんですか? 例を挙げながら行くとしますか。
例えば以下のコマンドを実行したとします。
cat index.html
catコマンドについては既に説明済みです。この場合はindex.htmlを標準出力に出力します。結果として画面に表示されます。これをパイプを使って動作を変更してみます。
cat index.html | more
パイプ記号を指定してその後にまた別のプログラムを指定しています。この例ではmoreというプログラムです。moreというプログラムは標準入力を読みとって、それが一定の量に達すると標準出力にまとめて送り出すというただそれだけのプログラムです。この一定の量というのは画面に表示できる文字数です。moreもcatと同様に標準入力から読みとって標準出力に書き出すよう出来ています。ここで例のようにパイプを使うとどうなるかですね。パイプの説明をもう一度すると「あるプログラムの標準出力を別のプログラムの標準入力に結合する」です。ここでは「あるプログラム」とはcatコマンド、「別のプログラム」とはmoreコマンドのことです。パイプの説明を読み替えると「catコマンドの標準出力をmoreコマンドの標準入力に結合する」になります。catコマンドがindex.htmlを読み出してその内容を標準出力に書き出すわけですが、そこで終わらずに今度はcatコマンドが標準出力に書き出した内容が自動的にmoreコマンドの標準入力に送られます。つまりmoreコマンドはcatコマンドが書きだした内容を標準入力から受け取ります。
moreは標準入力から入ってきた内容をため込んで一定量(画面に表示できる文字数)になるとそれを一気に標準出力に送り出します。つまり表示の一時停止を実行します。catコマンドのみだとどんどん表示してしまうのでスクロールする文字を目で追うことは不可能ですが、moreコマンドとこのように組み合わせることで一時停止を実現できます。パイプと同じことをリダイレクトでも実現することが可能です。
cat index.html > abc
more < abc
判りますよね。catコマンドの標準出力をabcというファイルにリダイレクトしています。後にabcファイルをmoreコマンドの標準入力としてリダイレクトしています。これでパイプと同じ動作を実現することは出来ますが、catコマンドの実行とmoreコマンドの実行という2段階を踏まないといけません。更にabcといったような適当なファイルを媒介させることとなります。当然ながらこのabcファイルは自分で削除しない限りはずっと残り続けます。何となくゴミが残った感じがしてイヤですよね。パイプを使えば余計なファイル名の指定等は不要ですし、2段階を踏む必要もありません。言い換えるとパイプとは「標準出力を標準入力にリダイレクトする」と言えるかもしれません。
パイプでプログラムの標準出力と標準入力をつなげるのは繰り返し指定できます。
cat index.html | nkf -e | more
ここではパイプを2回使っています。catの標準出力がnkfの標準入力に送られ、nkfの標準出力がmoreの標準入力に送られます。moreの標準出力にはパイプも使われていませんし、リダイレクトもされていません。従ってmoreが標準出力に書き出した内容が画面に表示されます。
今の例ではわざわざcatコマンドを使ってファイルの表示をしましたが、実際にはこんな事をする必要はありません。既にやっているようにnkfに直接ファイル名を指定すればOKです。
IPアドレス(1998/8/21)
IPアドレスっていうのは多分ご存じのことでしょう。123.456.654.321という風にピリオドで4部分に区切って表記されます。各ホスト毎に世界中でユニークなIPアドレスが振られています。ですが、ブラウザであちこちのHPを見に行くときにはURLにIPアドレスを直接指定する人は殆ど居ないでしょう。URLにはドメイン表記を使うことが殆どだと思います。つまり
http://www3.airnet.ne.jp/~vzr04461/
こんなヤツです。このURLのうち実際にホストを表すのはwww3.airnet.ne.jpの部分です。実際にはwww3.airnet.ne.jpに振られたIPアドレスがあるはずですが、URLにそれを入力する必要はありません。このドメイン表記のアドレスから実際のIPアドレスを求める作業は、internetではDNS(domain name service)によって行われています。ISPと契約した時にDNSのIPアドレスを教えてもらっているはずです。DNSでwww3.airnet.ne.jpのIPアドレスを要求すると、そのIPアドレスを調べて教えてくれます。ブラウザはこの教えてもらったIPアドレスを用いて表示しようとしているHPのあるサーバに接続に行きます。DNSがないとinternetが成り立たなくなると言っても過言ではないと思います。無数にあるIPアドレスを全て覚えるなんて人間には不可能です。
ブラウザでHPを見ているときにいつまで経っても表示されないということがよくあります。様々な要因が絡んでいるので直接の原因を探ることは困難ですが、ひょっとするとDNSがうまく機能していない等ということもないわけではありません。DNSの障害が発生していると、たとえ表示しようとしているHPのあるサーバが正常に稼働していてもうまく表示できません。そもそもそれ以前に、DNSが正常に動作していないわけですから相手のサーバに接続を行うこと自体が出来ません。DNSが正しくIPアドレスを返してくれるかどうか調べてみればDNSが原因かどうかくらいは判ります。それを手伝ってくれるコマンドとしてnslookupがあります。早速以下のようにしてみてください。
nslookup www3.airnet.ne.jp
さてどうでしょうか。場合によっては多少時間がかかるケースもあります。ここでもし
nslookup: Command not found
と表示されたらnslookupコマンドの在処にパス(すぐ後で説明します)が通っていないかもしれません。試しに以下のようにしてみてください。
find /usr/bin -name nslookup -print
さてどうでしょうか。以下のような表示になりませんでしたか?
/usr/bin/nslookup
表示されたならfindコマンドが/usr/bin傘下からnslookupという名前のファイルを見つけだしてくれたことになります。何も表示されない場合は見つからなかったということなので別の場所を探してみる必要がありますね。さて、何処を探したら見つかるのやら。試しに今度は/usr/etc傘下を探してみましょうか。
find /usr/etc -name nslookup -print
見つかったでしょうか。これでも見つからない場合はあまりやりたくはありませんが仕方がないので力技に出ましょうか。
find /usr -name nslookup -print
これはディレクトリ/usr傘下から隈無く探せ、という指示です。findコマンドは/usrの直下だけでなく更にその下にあるディレクトリまで全て潜っていって調べに行きます。/usr傘下にはかなり沢山のディレクトリがあるので多分実行が終わるまで時間がかかってしまいます。出来ればこういうファイル探索は避けたいところです(^^;) さてnslookupコマンドを実行しても無いと言われてしまうが、findコマンドによってnslookupコマンド自体は存在することが判った場合はおそらくパスが通っていないのが原因でしょう。パス(path:道)とはプログラムを探す場所のことです。何かコマンドを実行しようとしたときに、このパスで指定されているディレクトリからコマンドを探してきます。ですからパスにnslookupの在処が入っていなければnslookupは実行できません。以下のようにenvコマンドを実行してみて下さい。
env
どうでしょうか。以下のように沢山の内容が表示されると思います。
TERM=vt100
HOME=ホームディレクトリ
SHELL=シェル
USER=ユーザ名
PATH=なんとか:かんとか:どうの:こうの
LOGNAME=ログ名称
LANG=japanese
PWD=現在のディレクトリ
MANPATH=なんとか:かんとか
表示される内容はISPで使用しているOS等によって異なります。必ずしも上記とは一致しません。内容が異なっていても特に気にする必要はありません。envコマンドは環境変数と呼ばれるモノを表示します。環境変数はMS-DOS(当然Windowsにも)あります。MS-DOSであれば起動時に実行されるAUTOEXEC.BATに記述されます。必ず以下の形となっています。
環境変数名=環境変数の内容
必ず=が入ります。=の左が環境変数名で右がその内容です。HOMEやSHELL等といったキーワードが環境変数名です。この中でPATHという環境変数があると思います。これがパスを保持しています。このPATHにnslookupの在処を追加すればOKとなります。MS-DOSの場合にはAUTOEXEC.BATで環境変数をセットしますが、UNIXでは通常ログイン・シェル(login shell)で設定します。シェル・スクリプト等と呼ばれるのですが、ユーザがログインするとその時に早速実行されます。ではこれを変更することにしましょう。まずはホーム・ディレクトリに移動して下さい。そこで.cshrcというファイルがないか調べてみて下さい。Cシェルと呼ばれるシェル(後述)が使われている場合はホームディレクトリに.cshrcファイルを用意しておくと何かと便利です。もし既にあれば、まずはこの.cshrcファイルをftpのasciiモードでダウンロードしてください。お手持ちのエディタ(メモ帳等で可)でこのファイルを修正します。くどいですがダウンロードは必ずasciiモードで行って下さい。.cshrcファイルがなかった人は新規にそういう名前のファイルを用意することになります。
ダウンロードしたら早速エディタでこのファイルを開いてみましょう。おそらくそれほど長い内容ではないと思います(既に弄くっている人は別ですが)。その中で以下のような行があると思います。
set path=(なんとか かんとか どうの こうの)
ありましたか? もし無い場合は新しくこういう行を追加することになります。と言っても無いということはあり得ないはずなんですけどもね。set path=の後の括弧内にコマンドを探し出すパスを含めます。複数のディレクトリをスペースで区切って指定できます。括弧内に先ほどfindコマンドを実行した時に見つかったnslookupコマンドの在処を追加します。
set path=(なんとか かんとか どうの こうの /usr/etc)
こんな感じで大丈夫です。/usr/etcというのは例です。ISPによっては/usr/binだったり或いはもっと他のディレクトリということもあり得ます。findコマンドの結果のうち、set path=で指定するのはディレクトリの部分だけです。findコマンドで/usr/etc/nslookupと表示されたのなら/usr/etcだけをセットします。修正が終わったらまた.cshrcをasciiモードでサーバに転送します。これで終わりですが、サーバに転送しただけでは効力がありません。先ほどログイン・シェルはユーザがログインした時に実行されるといいました。ですからいったんログアウトして、再度ログインすれば修正後の.cshrcが実行されます。
再ログインしたら早速envコマンドを実行してPATHが正しく修正されているかどうか確かめてみましょう。さてここからはnslookupが実行できる状態になっている内容として説明します。nslookupコマンドはドメイン表記とIPアドレス表記の間で変換を行ってくれます。nslookupにはIPアドレスを知りたいホスト名を指定します。例えばnslookup www.os.rim.or.jpとしてみます。
Server: newmail.st.rim.or.jp
Address: 202.247.130.5Name: cache02.os.rim.or.jp
Address: 202.247.130.117
Aliases: www.os.rim.or.jp
実行結果は上記のようになります。最初の2行はあなたが利用しているDNSの情報です。ここに表示されるサーバはあなたが契約しているISPが持っている内容で、ブラウザがIPアドレスをもらいに行くのはここになります。ここでそのサーバ名とIPアドレスが表示されていれば、あなたが契約しているISPのネームサーバは正常に稼働していると思っていいでしょう。ネームサーバとはDNSをサービスしているサーバのことです。nslookupコマンドはこのネームサーバにwww.os.rim.or.jpのIPアドレスを教えてもらいにいきます。ネームサーバは指定されたホストを探しに行き、見つかればそのIPアドレスを返します。
次の3行ですが、ここにネームサーバが探し当てた情報が表示されます。Name欄には実際のホスト名が表示されます。Address欄にIPアドレスが表示されます。Aliases欄にはそのホスト用に割り当ててある別名が表示されます。本当のホスト名はcache02.os.rim.or.jpですが表向きにはwww.os.rim.or.jpとしてある、というわけです。
今はドメイン表記からIPアドレス表記を求めましたが、IPアドレスを直接指定することも出来ます。今度はnslookup 202.247.130.117としてみます。
Server: newmail.st.rim.or.jp
Address: 202.247.130.5Name: cache02.os.rim.or.jp
Address: 202.247.130.117
先ほどと同じような結果となります。果たしてIPアドレスがあっているかどうか、ブラウザにURLとして入力して確かめてみましょう。
http://202.247.130.117/~vzr04461/TeraTermPro/
どうでしょうか? このページが表示されればIPアドレスは間違っていません。もしHPがなかなか表示されない時にIPアドレスをURLに直接指定することで問題なく目的のページが表示されたのであれば、契約しているISPのDNSが何らかの原因で正常に機能していない可能性があります。
シェル(1998/11/15)
今まで特に触れてきませんでしたがそろそろシェルのことを書いてみます。シェルというと普通はコマンドプロセッサというような解釈が多いようです。つまりユーザがキーボードから何かを入力するとそれを解釈してプログラムを実行したりするわけです。今までリダイレクトやパイプという内容を使ってきましたが、これらもシェルが解釈して処理を行っています。OSが元々様々な機能を持っているわけですが、ユーザがそれらを使うために必要となる窓口として機能しているのがシェルということになります。MS-DOSであればCOMMAND.COMというプログラムがありますよね。MS-DOSではこのCOMMAND.COMが一応シェルの役割をしているということになります。
シェルは1種類しかないわけではなく当然色々な内容が存在していますが、やはりBシェルとCシェルが圧倒的に有名です。BシェルのBはBourneという人(作った人)の名前から来ています。BシェルはUNIXの黎明期から存在している歴史の古いシェルで、今でもこのBシェルは現役で使用されています。もう1つのCシェルはC言語と似た文法を用いることから付いた名前です。システム管理のような用途にはBシェル、通常のユーザが使用するのはCシェルという使い分けがおそらくパターンになっていると思います。
さてここではCシェルで話を進めます。以前envコマンドを実行したことがあったと思いますが、その時に表示された環境変数の中にSHELLというのがあったと思います。この環境変数は使われているシェルのパスを表しています。Cシェルであればおそらくパスの中にcshという名前が含まれていると思います。何故シェルの話が始まったかというと、シェルについて知っているとtelnetで色々な作業をする際に何かと助けられることが多いためです。そこでシェルはこういうことをしてくれる、という話を中心にします。
とりあえず簡単なところから行きましょうか。コマンドヒストリの機能。言葉から何となく想像が付くと思いますがユーザが今までに入力してきた内容はコマンドヒストリとして、ある程度まで覚えておいてくれるので比較的最近入力した内容であればわざわざまた全部入力しなくても済みます。説明の前にとりあえずhistoryと入力してみて下さい。
1 cd public_html
2 ls
3 chmod 604 index.html
4 mkdir storehouse
5 chmod 701 storehouse
6 cd storehouse
7 pwd
8 cp ../index.html storehouse.html
9 chmod 604 storehouse.html
10 ls
例えばこんな内容が表示されます。これはあくまで例ですので実際には全然違う内容が表示されると思います。historyコマンドは今説明したコマンドヒストリを表示してくれます。この例だと一番最近入力した内容を10件まで覚えてくれていて、それが一覧表示されたわけです。左に付いている番号について大きい方が最近の入力、小さい方がもっと以前に入力した内容です。さて、かつて入力された内容が判るのはいいとしてその具体的な利用方法を説明しましょう。
8番の履歴を見ると何やらcpコマンドを実行したようです。8番のcpコマンドと全く同じ事をもう1度実行したくなったとします。また最初からcp ../index.html storehouse.htmlと入力しなくても、ちょっと指示を与えてやれば簡単に出来ます。8番の内容をもう1度実行したいのであれば
!8
と入力することで全て事が済んでしまいます。コマンドヒストリに残っている内容を用いる時には最初に!を付けます。今は8番の内容を実行したかったのでその番号である8を!に続けて指定します。
ところがですね、これでは実はあまり便利ではありません。何故かと言えば番号が判らないことには指定出来ないからです。普通だと番号はhistoryコマンドを実行しないと判りません。折角入力の手間を減らすためにコマンドヒストリの機能を覚えても、毎回historyコマンドを入力しなければならないのでは本末転倒ですね。そこでもう少し工夫して指示を与えてやることにします。今度は以下のように入力してみて下さい。
!cp
もうお判りでしょう。今度は番号ではなく入力した内容そのものの一部を指定しています。ここでは「cpなんとかかんとか」という内容の履歴を実行するよう指示しています。結果としてコマンドヒストリ中にある8番の内容(cpで始まっている)を実行することになります。!の後に指定する内容は何文字でも構いません。場合によっては1文字だけでもOKです。しかしここで注意しないといけないことがあります。!に続ける内容が1文字でもいいと言いましたが、8番の内容を実行させるつもりで
!c
とした場合です。1文字でいいのだからcだけを指定した、というわけですね。当然「cなんとかかんとか」という内容を実行することになるわけですが、困ったことにcで始まる内容がコマンドヒストリ中にいくつもあります。1番、3番、5番、6番、8番、9番は何れもcで始まる内容です。!cとした時にどれが実行されるかというと答えは9番です。コマンドヒストリからは新しい順に探し出されます。新しい順ということは番号の大きい順ということになるので10番から1番へ向かって探しに行くことになります。ですから最初に見つかる「cなんとかかんとか」は9番ということになります。
コマンドヒストリに蓄えられる件数は.cshrcファイルで指定出来ます。もし50件まで覚えておいて欲しいのであれば.cshrcに以下の1行を追加します。
set history=50
好きな数字をhistory=の後に指定して下さい。でもあまり多くしすぎても不便になってしまいます。10辺りが適当かと思います。
次の話題に進みます。今度はファイル名補完の機能です。補完というのが何のことかよく判らないかもしれませんが、長いファイル名を入力する時にシェルにちょっと手伝ってもらおうというわけです。まずはファイル名の補完をしてもらうために.cshrcに以下の行を追加します。
set filec
この1行があるとファイル名の補完機能を利用できるようになります。早速利用してみましょう。今仮にls -lとしたら以下のようなファイルがカレントにあったとします(permissionの表示等は省略して書いています)。
this_is_a_very_long_file_name.txt
この長いファイル名を入力する手間を省きたいというのが目的です。例えばcatコマンドでこのファイルの内容を表示しようとする時にcatコマンドに指定する上記ファイル名の入力で手を抜く場合は
cat t
という風に、ファイル名の1文字目のtまでを入力してESCキーを押します。いかがなものでしょう。
cat this_is_a_very_long_file_name.txt
シェルがファイル名の残りを補ってくれました。これがファイル名の補完です。さて次のようなファイルがある場合にファイル名の補完はどうなるのでしょうか。
this_is_a_very_long_file_name.txt
this_is_not_very_long.txt
tで始まるファイルが2つありますね。試しに先頭のtまで入力してESCキーを押すと
cat this_is_
補ってはくれたものの尻切れトンボです。tで始まるファイルが2つあって、どちらもthis_is_までは同じなのでそこまではシェルが補ってくれます。しかし2つあるうちのどちらを目的としているのかはシェルには判りません。ですからここまで補っただけで終わってしまいます。更に残りを補って欲しい場合は2つあるファイルを区別できるようになる辺りまでもう少し入力してやります。とりあえずthis_is_の後にnを続けてもう1度ESCを押して下さい。
cat this_is_not_very_long.txt
今度はばっちりでしたね。ですがthis_is_で始まるファイルにどのような内容があるかが判らないことにはthis_is_の後に何を続けてからESCを押せば良いか判りません。cat this_is_まで補ってくれた時点でCTRL+Dを押すと該当するファイルの一覧を表示してくれます。しかも一覧表示の後にご丁寧にもまたcat this_is_が表示されて入力待ちとなっています。
もう1つ便利な機能としてエイリアス機能を説明します。エイリアス(alias)機能は別名定義の機能という風に解釈できるでしょうか。lsコマンドは使用頻度の高いコマンドだと思いますが、lsのみだとファイル名だけしか表示されません。lsコマンドはオプションを指定することでファイル名以外の情報も同時に表示してくれます。試しにls -aFglとしてみましょう。lsのみの時と比べて結構賑やかになります。毎回ls -aFglと入力する代わりに単にlsとだけ入力すれば自動的にls -aFglと読み替えてくれると便利です。こういう時にエイリアス機能を使ってみましょう。また例によって.cshrcファイルに行を追加します。
alias ls 'ls -aFgl \!*'
これでエイリアス機能が働いてくれます。ここではlsを実行する時はls -aFglに置き換えてから実行するように定義しています。ls -aFglの後に\!*というのが付いていますが、これはlsの後に指定された内容をそのまま使うように指示しています。例えばls *.htmlとした時にエイリアス機能によってlsがls -aFglに置き換わるわけですが、ls *.htmlとしたのですからls -aFgl *.htmlに置き換わってくれないと困ります。最後の\!*はlsより後ろに入力された内容(この場合は*.html)を表します。他にもあると助かると思う内容があればそれもエイリアス定義しておくと良いかもしれません。
プログラム実行(1999/1/3)
このページを更新するのは久しぶりです。次に何を書こうとしていたのかすっかり忘れてしまっているのでプログラムを実行するときのことを少し。
プログラムを実行するにはそのプログラムに実行可能属性のpermissionがついていないといけないのは以前説明しました。catコマンド等はC言語で書かれたプログラムで、コンパイル済みの内容です。当然ながら実行できます。しかしプログラムがコンパイルされたバイナリだけとは限りません。中身がテキストファイルであっても、必要なことがちゃんとなされていれば実行することができます。シェルのスクリプトやperl等の言語で書かれたプログラムはテキストファイルですが立派なプログラムです。これらは必要なことが指定されてさえいれば実行できます。それについて触れましょう。今回もシェルの話です。
cgiプログラムを作ったり或いはそのソースを見たことがある人はこのような記述がなされているのを見かけたことがあることでしょう。
#! /usr/local/bin/perl
こんな行がプログラムの先頭に入っています。こういった1行が先頭に入っているテキストファイルは実行可能属性をつけてやればプログラムとして実行できます。この行の形式は簡単で#!に続けてこのテキストファイルを入力として受け取らせるプログラムを指定するだけです。ここでは/usr/local/bin/perlを指定しています。ということはつまり、このテキストファイルはperlで書かれたプログラムと想像できます。試しに以下のような簡単なperlのプログラムを用意し、実行可能属性をつけてみましょう。ファイル名は例えばhello.pl等としておきます。
#! /usr/local/bin/perl
print "hello!\n";
プログラムはこれだけです。ブラウザから実行させるような内容でもないのでpermissionは700でいいでしょう。これでtelnetからオーナのみがこれを実行できます。さてpermissionをつけたら実行してみます。実行する際には
./hello.pl
としてみてください。正常に実行できましたでしょうか。カレントを示す./をつけたのはカレントにパスが通っていない場合が多いであろうということです。このhello.plファイルの在処がパスの通った場所(環境変数PATHにセットされている場所)にあるなら./は要りません。カレントがそこになっている必要もありません。
MS-DOSを使用している人は環境変数PROMPTに$P$G等をセットしておくことでカレントがプロンプトに表示されることをご存じでしょう。unixでも当然同じことが出来ます。shellでその機能を提供しているのでそれを利用するだけでOKですが、ここでは既存のプログラムを利用してみましょう。pwdというコマンドでカレントを知ることが出来るのはだいぶ以前に説明しました。このコマンドはカレントを標準出力に出力するようになっています。これを利用しましょう。例によってまたホームディレクトリの.cshrcファイルに手を加えます。
set prompt=`pwd`
この1行を追加してみましょう。一度logoutを行い再度loginしてみましょう。或いはホームディレクトリにて
source .cshrc
という方法でもOKです。これで.cshrcを読み直しさせることが出来ます。さて.cshrcに追加した行についてですが、pwdとあるのでこれがpwdコマンドを表しているであろうことは誰にでも判るでしょう。環境変数promptに何かしらを代入しているのも判るでしょう。説明が必要なのはpwdを括っている``の記号でしょう。この記号で括ると、括った部分に指定したプログラム(この場合はpwdコマンド)の標準出力を取り込むようになっています。つまりpwdはカレントを標準出力に出力するので`pwd`とすることで環境変数promptはカレントを表すようになるのです。あまり意味はありませんが試しにhello.plを``で括って指定してみましょう。
set prompt=`~/hello.pl`
こんな感じです。ここではhello.plがホームディレクトリにあることを前提にして上記のようにしましたが、適宜hello.plのパスを指定してください。~記号がホームディレクトリを表すのはかなり最初の方で説明しましたよね? これでhello.plが標準出力に出力した内容が毎回プロンプトに表示されるはずです。と言っても毎回hello!と表示するだけですけどもね(^^;) 今度はこんなperlのプログラムを指定してみましょう。
#! /usr/local/bin/perl
$_ = `pwd`;
s#^/home/usr3/##;
print;
この4行です。ただしこれはRIMNETでの私ののアカウント用ですので3行目のs#^と##で囲まれた部分を適宜変更するようにします。まずはホームディレクトリに居るときにpwdコマンドを実行して表示される内容を確かめます。RIMNETの場合は/home/usr3/vzr04461等と表示されるので、この/home/usr3/の部分をカットしてしまうようにします。3行目のs#^/home/usr3/##という部分はこの/home/usr3/をカットしています。pwdコマンドでホームディレクトリのパスを確認したらカットさせたい部分をs#^と##の間に指定します。$_ = `pwd`という行はpwdコマンドの標準出力を取り込んでいる部分です。取り込んだ内容からs#^〜##で不要部分をカットし、それを標準出力に出力しています。このプログラムをホームディレクトリに置き、例えばshowpwd.pl等と名前を付けてpermissionとして700をつけます。そこまで終わったら.cshrcファイルに
set prompt=`~/showpwd.pl`
という行を追加します。logoutとloginを行うか或いはホームディレクトリでsource .cshrcとしてみます。いかがなものでしょう。プロンプトにカレントが表示されます。試しにpublic_htmlに移動してみます。ちゃんとプロンプト表示が新しくなっていることを確認してみてください。