今日の一言
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)