トップ «前の日記(2010/05/10(Mon)) 最新 次の日記(2010/05/12(Wed))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2010/05/11(Tue) お部屋をお連れします [長年日記] 18:16現在 15℃

_ [Ubuntu][FC][Linux][雑記][研究関係] シェルスクリプトで注意すべきこと(/bin/shの秘密)(某interfaceな会社のADボード用ドライバのインストール時に起きたトラブルの原因)

*某interfaceな会社のADボード用ドライバのインストールで苦しめられたので、その原因をメモっておく。

大抵のシェルスクリプトでは、ファイルの先頭に、

 #!/bin/sh

という記述がされていると思う。

が、しかし!

最近のLinuxでは、/bin/shをシンボリックリンクとし、「bourn shell」そのものではなく、「bash」等の別のシェルを実体として使っているものが多い。

*シンボリックリンクの確認は以下のコマンドで出来る。

 $ ls -l /bin/sh

加えて、「bash」は「/bin/sh」として呼び出された場合も、「bash」で拡張された機能をそのまま使うことが出来る。

この影響で、「/bin/shを使うようにshebangが指定されているにもかかわらず,実際にはbashでなければ動かない」という困ったものが混ざっていることがある。

更に、一部のディストリビューションでは「ash」が「/bin/sh」の実体として使われることもあり、特に、Debian系のディストリビューションでは、Debian版のashである「Debian Almquist Shell (dash)」が使われている。

で、なぜこんなことを書くかというと、某ADボード用ドライバのインストールスクリプトが、「bash」であることを前提にかかれており、マニュアルどおりのコマンド

 $ sudo sh install

ではうまく動かなかったからである。

*Ubuntuは、「/bin/sh」に「dash」がシンボリックリンクされているが、デフォルトのログインシェルは「bash」という妙な仕様になっている。

これの対処法としては、

方法1.

 $ sudo bash install

と、「bash」で実行する。

方法2.

シェルスクリプトの先頭の

 #!/bin/sh

 #!/bin/bash

とし、

 $ sudo ./install

と、実行ファイルとして実行する。

方法3.パイプからの入力を標準出力と指定ファイルに書き出す

/bin/shをbashのシンボリックリンクに差し替えてしまう。

まず、以下のコマンドを実行。

 $ sudo dpkg-reconfigure dash

実行すると「Install dash as /bin/sh?」と確認されるので、<いいえ>を選択。

これで、「dash」の代わりに「bash」が使われるようになる。

*自分のおすすめは「方法3」。個人的に「dash」はちょっと・・・。

まあ、「/bin/sh」を指定しておいて、「bash」でしか動かないようなものを書くのがそもそも間違いだと思うがな!

参考:

http://gihyo.jp/admin/serial/01/ubuntu-recipe/0018?page=2

http://ja.wikipedia.org/wiki/Bourne_Shell

http://ja.wikipedia.org/wiki/Bash

http://ja.wikipedia.org/wiki/Almquist_Shell

_ [Ubuntu][FC][Linux][雑記][研究関係]パイプからの入力を標準出力と指定ファイルに書き出す(tee)

普通に出力をファイルにリダイレクトしてしまうと、画面上で処理過程を見ることができない。

なので、make等を行う際には、

 $ make |& tee tmp4make (csh・tcsh の場合)
 $ make 2>&1 | tee tmp4make (sh・bash の場合)

とする。これだと、コンパイル結果を画面で確認しつつ、ファイル make-log にコンパイルの過程を書き込むことができる。