
Ubuntu日本語フォーラム

ログインしていません。
あるソフトの setup というシェルスクリプトを実行したら
./setup: 1: Syntax error: "&" unexpected
というエラーが出ました。
このスクリプトの冒頭は以下のようになっています。
#!/bin/sh
script_path=`dirname $0`
if [ -z $script_path ] ;then
script_path=`which $0 |& tail -1`
fi
(以下省略)
4行目の|& でエラーが出ているのかなと思い、上記5行だけの別名のファイルを
作成して実行したところ、同じエラーが出て現象を再現できました。
あるソフトというのは、ハードウェア屋さんには有名なALTERA社のQuartus II という
FPGA開発環境で WEBエディションという無料のバージョンです。
サポートしている OS は、Windows と Linux は Red Hat, SUSE, CentOS の3つの
ディストリビューションのみです。
Ubuntu はサポートしていませんが、なんとかインストールできないものかと
始めたのですが、いきなりつまづいてしまいました。
上記スクリプトの意味は、参考書を調べました。
$0のファイル名(+ディレクトリ名)から、dirnameでディレクトリ名を取り出して
その文字数が0、つまりディレクトリ名が入力されてなくてファイル名のみの場合は、
$0のpathをパイプでtailに渡して最後の1行を、script_pathという変数に設定する、
ということらしい、のはわかったのですが|& がよくわかりません。
なぜエラーになるのか、どうすれば回避できるのか?
以上、宜しくお願いします。
オフライン
|&
はbashのpipelineの記号なので、bashでしか使うことができません。
問題となっているスクリプトの最初に
#!/bin/sh
と記述されているため、このスクリプトは、/bin/shで実行されますが、Ubuntuでは、
$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 3月 30 03:53 /bin/sh -> dash
のようになっており、bashではなくdashで実行されることになります。
dashは昔のshを再現したshellですが、debianに由来するshellであるため、(少くとも標準状態では)debianの流れをくむディストリビューションにしか入っていないかと思います。
本来、bashでしか実行できないスクリプトなら、
#!/bin/bash
とするべきだと考えますが、多くのディストリビューションでは、/bin/shがbashへのシンボリックリンクになっているため、このような書き方をする向きもあるようです。
なので、先頭を
#!/bin/bash
に書き換えることで実行できるようになるかと思います。
なお、|&の意味については、man bashして確認下さい。
オフライン
早々に分かり易い解説を有難うございます。
bash ではなく dash というのがあるなんて知りませんでした。へ~
Linux はデフォルトでは全て bash だと思っていました。
早速 #!/bin/sh を #!/bin/bash に変更して試してみたところ、
質問したエラーは出なくなりました。
有難うございました。すっきりしました。
が、別のエラーが出て止まりました(泣)
サポートしていないディストリビューションで動くようにするのは、
私のレベルでは前途多難な気がします・・・
オフライン