goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

シェルの先頭の#!

2007-05-12 17:21:24 | PG(UNIX)

シェルスクリプトの先頭行に「#!/bin/sh」とよく書くけど、あれの意味が初めて分かった

今まで「シェルの種類」を書くものだと思ってた。シェルにはshだのkshだの色々あるから。
実は、実行権限の付いたテキストファイルを直接実行するときに「そのファイル(自分自身)を どのコマンドを使って実行するか」を指定するものらしい。
(だから、shコマンドの引数としてスクリプトファイルを指定する場合には、先頭行に書いたシェルの種類の指定は意味なかったんだなぁ。そこに付けた「-x」オプションが無視された(ように思えた)のも同じ理由か。「#」から始まる行は単なるコメントだし)

そんでもって、主要な使い道がシェルのスクリプトだから/bin/shとか/bin/kshとか書かれているのをよく目にしていただけであって、実はどんなコマンドでも出来るみたいだ。
と言ってもtailとかに使ってもあまり意味は無いので(爆)、awkとか、ある程度プログラムが書ける(=スクリプト)ファイルで使う想定なんだろうな~。


awk(と懐かしのC)

2007-03-06 21:00:00 | PG(UNIX)

awkのメモを作成。
ついでに、UNIXコマンド一覧の「ファイル内容関連」を、ファイル内容の表示関連と編集関連に分割。awkは編集関連ね。
…編集と表示って、意外と区別が付けづらいなー…。


awk。大学時代に、情報工学科のyaccとlexの実習としてawkのインタープリターをC言語で作ったなぁ。(だから四則演算クラスなんてものも、あまり違和感無く作れた)
しかしその割に、awkの文法の細かい所は結構忘れてしまった(苦笑) まぁ使ってないと忘れるよなー。「BEGIN」を見て、そんなものがあったなー!!と懐かしかった(爆)

awkの文法や関数はC言語に似てるんだけど、printfはC言語より柔軟なので、実装するのは意外と面倒だったり。なにせ変数は数値でも文字列でも扱えるので、%dや%s等の書式を、C言語のvsprintfなんかにそのまま渡すわけにはいかない。結局自分で書式を解釈してやらないといけないんだよねー。
ついでに「\n」もC言語ではプリプロセッサーが解釈するから、awkインタープリターでは自作しないといけない。

おお、そういえば、あの頃はローカル変数の宣言に「auto」を付けてたなぁ。
「static」「extern」「auto」のそれぞれの直後にタブを入れると、タブが8桁なら、変数名の桁がぴったり並ぶので綺麗かと。そうなるとregisterはちょっと長いので、#defineしてみたり。
つーか、今どきregister宣言なんか使わねー(爆)