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 10月 7 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の違いを意識してなかったので,これから勉強していきます!