意外な理由(?)で「Shell script arrays Syntax error: “(” unexpected」

XWSS016787_s

先日、シェルスクリプトを記述していたところ、以下のエラーが出てどうしようも無くなってしまった。

Shell script arrays Syntax error: “(” unexpected

解決方法を探しにネットを彷徨うと、やれ「改行コード」を直せだの「行頭の宣言」を付けろだの消せだの#を余分に付けてみろだのいろいろな意見があったが、解決できなかった。

スポンサードリンク

今回のテストは以前記述したものをちょっと拡張してみようと思ったものなので、弄りまくっている(というか動いているのが不思議な)Ubuntu 12.04 LTS で試した。

テストも何も、数行のシェルスクリプトで間違っていると言われても、その箇所を見つけるほうが困難なくらいだ。しかも、問題の箇所を探すために極限までスクリプトを削ってもエラーは無くならなかった。

bash を指定して実行すれば?

諦めかけた時に出会ったのが「Shell script arrays Syntax error: “(” unexpected | Sany’s Linux and Open Source Blog」で、次のように解決するように示されていた:

$ bash arrays.sh

これを試したところ、期待した動作をした。助かった~。

他の記事にも似た言及があって、シンボリックを貼り直せなどの意見が見られた。

Ubuntu の /bin/sh は、bash のシンボリックリンクではなく、dash (Debian Almquist Shell)になっています。(中略)世の中には、シェルスクリプトの先頭に #!/bin/sh と書いておきながら、 bash でしか動作しないコードを含んでいるものもあります。正しくは、そのシェルスクリプトで #!/bin/bash と書き換えるべきなのですが、 それも難しい場合があります。(「まさおのブログ (表): Ubuntu /bin/sh -> /bin/dash → /bin/bash 切り替え」より引用)

/bin/sh は何を指してる?

が、「#!/bin/sh」も「#!/bin/bash」もダメで、「$ bash ~」だけが今のところ動作するんだよな・・。ということで、あとで直そうかと思ったけれど、いまやって見ることにした。

確認

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 30  2012 /bin/sh -> dash

あ、ホントだ・・。

shは dash になってる。

今頃気がついたよ orz…

修正

XWSS016788_s

$ sudo dpkg-reconfigure dash

何か出た。そのままEnter(=Yes) !

確認

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 30  2012 /bin/sh -> dash

あれ?直ってない。

XWSS016789_s

あ、あぁ。

「dash をシステムのデフォルトとして使う?」って聞かれているのか。

No を選択・・。

$ sudo dpkg-reconfigure dash
Removing 'diversion of /bin/sh to /bin/sh.distrib by dash'
Adding 'diversion of /bin/sh to /bin/sh.distrib by bash'
Removing 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash'
Adding 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by bash'

確認

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr  6 10:25 /bin/sh -> bash

おー。

確認

このマシンでは、今まで「$ bash ~」でしか動作しなかったけれど、「$ sh ~」で動作するようになった!

# ちょっと恥ずかしい内容だなー。このマシンでシェルスクリプトを云々がなかったから構築して相当経過しているけど全然気が付かなかった・・。普段シェルスクリプト書いたり動かしたりしてるFreeBSD やCentOS では今まで出会ったことがなかったよ。

参考文献

関連記事

スポンサードリンク

Comments

One thought

コメントを残す

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