/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

シェルスクリプトでSyntax error: "(" unexpectedの対処法(Ubuntu)

Ubuntuにて、githubから持ってきたスクリプトがSyntax errorとなってしまいました。orz

$ ./XXXXX.sh: 111: ./XXXXX.sh: Syntax error: "(" unexpected

githubに上がっているスクリプトでエラーって・・・早々無いだろうと。みんな凄腕のプログラマーたちだから、何かしら自分の環境とあわないのかなと思って調べてみました。

そしたらこんな情報が。

シェルスクリプトで『Syntax error: "(" unexpected』とかなった場合のメモ - 牌語備忘録 - pygo

./ではなく、bashをつけてやってみればいいとのことでやってみたところ・・・・・動いた!!

わからねぇ。なんでなんだろうと思ってもうちょっと調べてみたところ、どうやらshで実行した場合はdashで実行されるケースがあるとのこと。

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

そうなんだね。知らなかった。そもそもdashというものがあるということ自体知らなかった。

で、スクリプトの一番上を見てみたら見事に

#!/bin/sh

と書いてあった。そしてサーバのshも調べてみたところ

ubuntu@ubuntu-armhf:/bin$ ls -ltra sh
lrwxrwxrwx 1 root root 4  8月 15  2012 sh -> dash

ってなってた。ビンゴだね。これをdashではなく、bashで実行すればSyntax errorもなくなるだろう。

ってことでスクリプトの一番上を以下に変更。

#!/bin/bash

これで./でも動くようになった。

とりあえず解決。