shellでハマった「sh」と「bash」の違いについて

Cygwin_X11_rootless_WinXP
LINEで送る
Share on GREE
Share on LinkedIn

linuxを使っているとshとbashというコマンド対応言語が数種類あることは知っていたが、その2つの違いはさほど認識していなかった。

本日、ツールを実行していて、どうしてもエラーが回避できなかったので、調べていた結果、shとbashの違いによる
エラーという事が判明したので、備忘録としてメモしておきます。

事の発端はshellで配列を使いたかっただけ

shell.sh

これで配列の1番目(0からスタート)の「b」という文字列が帰ってくれば問題ないのだが、
開発していた端末ではうまく動作し、検証環境において、エラーが発生

エラー内容

下記のようなエラーが出て一向に進まない状態。
調べてみても、エスケープ処理が違うとか、配列文字が長すぎるなどという的違いな答えばかり。

実行環境

開発端末 : Mac OS X
検証環境 : Vagrant Linux [ ubuntu 14 ]
本番環境 : debian7

どうやら、macOSとlinuxに何か決定的な違いがあると思われる。
きっと検証環境と本番環境は同じディストリのlinuxであるから、本番でも同じ事が
起きると思われる。

原因判明

shellの文献を見ているとどうやらbashという文字がやたらにあるので、shではなくbashが通常と思われる。
shell.shの1行目に「#!/bin/sh」とある箇所が悪いのかと思い、「#!/bin/bash」に変更してみるも、
結果は変わらず。

そして、コマンド実行に原因があることに気がついた。
(ここまで2時間・・・orz)

無事にlinuxでエラーも出ずに返り値を取得できた。
さらに、macでもbashコマンドにて、同様のレスをゲット

なんという事でしょう。

Macはshとbashで同じ結果だったのです。
Linuxはshとbashで違いがありますが、とりあえず、今後は特殊な環境で無い限り「bash」を使おうと心に違いました。

失敗を経て成長するべし

原因に気がつくまでの遠い道のりは、成功への足がかりとして心に止めておくことにしよう。

ちなみに、こまった事がもうひとつあり、「date」コマンドでマイクロ秒の取得で

Mac : 取得できない
Linux : 取得できる

という違いも発生していて、これはshとbashの違いではなさそうです。
引き続きこのへんも調査して、便利に使えるようにしておきましょう。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*