シェル文法の勘違い
先日ポストした記事で Debian GNU/Linux 系の PC-UNIX である Ubuntu をインストールしたことを紹介しましたが,Ubuntu はその後も少しずつ使い続けています.システムは大変安定しており,GCC のビルドなどで高い負荷をかけてもビクともしません.
それでは・・・ということで,5年ほど前に使用を中止していた昔のデータ処理プログラム群をバックアップから戻して復活させようと使い始めたところ,早速壁にぶち当たりました.まず最初は GCC のオプションの仕様変更で,CPU 固有の最適化オプションの書き方が変わったため,Makefile をわずかではありますが書き直さなければならなくなりました.また main 関数を "void" で型宣言したものには "int" ではないよと警告が出るようになりました.ふーむ・・・5年の歳月はこの世界では長い,ということを思い知らされます.
これらはマイナーな変更で騒ぐほどではないのですが,最も面食らったのはシェルの仕様にまつわるものです.少々話がややこしいのですが,Ubuntu では /bin/sh は /bin/dash (Debian Almquist Shell) という元祖 Bourne Shell のクローンにリンクされており,これは高機能な /bin/bash (Bourne-Again Shell) とは別物の軽いシェルです.私の以前の環境では /bin/sh とは /bin/bash へのリンクでしたので,私は /bin/sh と /bin/bash はほとんど同一仕様と思っていました.これが面食らいの第一の原因です.
ところで,シェルスクリプトの中で算術演算を行う場合,オリジナルの Bourne Shell にはその機能が無いため,大昔は外部コマンド "expr" を使って
`expr 算術式`と書かなければなりませんでした.これは今でも有効なのですが書式が面倒なので,ちょっと以前の /bin/bash ではシェル内蔵の機能を使って
$[算術式]という形式で記述することができました.私はこれを覚えちゃっていたので,これが標準と勘違いしていました.これが面食らいの第二の原因です.
ところがこの書式は元祖 /bin/sh のクローンと言われる /bin/dash では元々使えないばかりか,/bin/bash でもすでに非推奨であり,現在では
$((算術式))という形式に変更されています.実はこの形式は /bin/dash でも有効です.これに気が付くまで,以前は問題なく動作していた $[算術式] 形式を含むスクリプトの挙動がおかしいのに悩まされ続けました.つまり,/bin/bash であれば $[算術式] はまだ動いたはずなのですが,Ubuntu のデフォルトのシェルは /bin/dash であったために,これは動かなかったのです.これが面食らいの第三の原因です.複数の思い違いが重なって,原因追求に時間がかかってしまいました.
話はさらに続きます.データ処理の結果をグラフにするときには昔から "gnuplot" のお世話になっているのですが,これもだいぶバージョンが上がり,新しい命令が増えたり挙動が微妙に変わっているのに気が付きました.出力に PostScript ファイルを指定している場合,描画領域を超えてラベルの位置指定をする場合の挙動が以前とは変わっているようですし,それ以外にもデフォルトのパラメータが少し違うようで,サイズや位置が以前とは微妙にずれます.
これらに対応すべく少しずつ修正を加え,不具合の回避方法を探し,パラメータを試行錯誤で調整し,ということをやっていくのですが,結構な手間と時間がかかります.ということで,週末の時間をだいぶ潰し,プリンタ用紙をかなり無駄にしながら,しかし昔の環境を少しずつ復活してきました.
それにしても,ソフトウェアのメンテナンスって本当に大変.自分は何も変えていなくても環境がどんどん変わって土俵やルールが変わるので,数年で完全に置いて行かれます.2000年問題のときにはさぞや大変だったのでしょうね.
| 固定リンク | 0
「IT関連情報」カテゴリの記事
- Refsort/Ruby v3.71 released(2022.03.12)
- Refsort/Ruby v3.70 released(2022.02.10)
- IOC List v12.1 released(2022.01.21)
- 緊急着陸して滑走路を外れたB2(2022.01.15)
コメント