1. ubuntu /bin/shはbashではなくdash

ubuntuのシェルスクリプトを作成していて問題が生じました。

せっかくですので生じた問題と解決方法を共有します。

  1. 問題の発端

  2. shの確認、dash?

  3. ubuntuのdashについての情報源

  4. 問題の解決方法

の順にご説明します。

2. 問題の発端

シェルスクリプトを作成しています。

シェルスクリプトは指定されたテキストを印字する簡単なものです。テキストは改行コード"\n"を指定できます。

sample.sh
echo $'aaa\nbbb'

このスクリプトをsourceコマンドで読み込むと期待したように改行して印字できます。

実行結果1
$ source sample.sh
aaa
bbb

ところが、sh sample.shで実行してみると結果が変わります。

実行結果2
$ sh sample.sh
$aaa
bbb

行頭に$が残っています。

改行コードも見た目は折り返して居ますが、テキストを別の処理に渡した時に問題が生じたりしています。

恐らくエスケープ処理が想定とは異なっています。

問題の発端をまとめると

sourceとshでスクリプトを呼び出したときに結果が異なる

ということです。

3. shの確認、dash?

shの実態を確認します。

Terminal
$ which sh
/bin/sh
$ ls -l /bin/sh
lrwxrwxrwx 1 root root  /bin/sh -> dash

dash?

聞きなれないコマンドが出てきました。検索します。

4. ubuntuのdashについての情報源

dashまで突き止めていたので有用な情報源をすぐに見つけることができました。

実はdashを突き止めるまでに右往左往したので無駄な時間を費やしました。

5. 問題の解決方法

ここまで突き止めれば解決方法は簡単です。

shではなくbashでスクリプトを呼び出せばsourceと同様の結果となります。

解決方法と実行結果
$ bash sample.sh
aaa
bbb

sourceで実行した場合と同じ結果を得ることができました。

6. まとめ

Ubuntu の sh は bash ではなく dash

次から次へと疑問点が生じてくるので自分の知識のなさ恨みつつも新しい知識を得られたことを喜んでいます。

もし同じような問題で悩んでおられる方の疑問を解消することができたら幸いです。

今回は以上です。