Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

CentOSの/bin/shとUbuntuの/bin/shの違い

こんにちは.miです.

先日(会社とは関係ないところで)サーバをリプレースした際,OSをCentOSからUbuntuに変えたら,とあるシェルスクリプトがエラーで動かなくなりました.

その原因について調べたことを書きます.

動かないスクリプト(部分)

こんな感じのです.

#!/bin/sh
(中略)
LOG_FILES=`ls ${LOG_TOP_DIR} | grep -e ".log" -e "\.csv"  | sed -n ''${LOOP}'p'`
array[${LOOP}]="${LOG_FILES}"

実行結果

./hoge.sh: 11: ./hoge.sh: array[1]=file.csv: not found

配列が使えてません.

原因

タイトルに書きましたとおり,CentOSの/bin/shとUbuntuの/bin/shの違いによるものでした.

  • CentOS
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 107  2014 /bin/sh -> bash
  • Ubuntu
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4  2月 19  2014 /bin/sh -> dash*

てっきりsh=bashが呼ばれるものと思い込んでたんですが,そうでは無かったです. というかdashの存在を知らなかった(恥)

対策

bashで実行するように, 1行目を

#!/bin/bash

に書き換えました.

おわりに

dashについて調べてみると,

Wikipediaに成り立ちが書かれてたり,

Debian Almquist shell - Wikipedia

各シェルの違いをまとめてくれているサイトがあったりして

bash、dash、mkshの互換性 - 「希望」という字が好き

結構有名なお話のようでした.

シェルスクリプトを書くときに,今まではshとbashの違いを意識してなかったので,これから勉強していきます!