お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-05-03 15:59:33

QP
新しいメンバ
登録日: 2011-10-07

シェルスクリプト,|& でエラー

あるソフトの 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という変数に設定する、
ということらしい、のはわかったのですが|& がよくわかりません。
なぜエラーになるのか、どうすれば回避できるのか?

以上、宜しくお願いします。

オフライン

 

#2 2012-05-03 18:23:58

hmatsue
アドバイザ
登録日: 2009-03-10

Re: シェルスクリプト,|& でエラー

コード:

|&

は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して確認下さい。

オフライン

 

#3 2012-05-03 19:49:59

QP
新しいメンバ
登録日: 2011-10-07

Re: シェルスクリプト,|& でエラー

早々に分かり易い解説を有難うございます。

bash ではなく dash というのがあるなんて知りませんでした。へ~
Linux はデフォルトでは全て bash だと思っていました。
早速 #!/bin/sh を #!/bin/bash に変更して試してみたところ、
質問したエラーは出なくなりました。
有難うございました。すっきりしました。

が、別のエラーが出て止まりました(泣)
サポートしていないディストリビューションで動くようにするのは、
私のレベルでは前途多難な気がします・・・

オフライン

 

Board footer

Powered by FluxBB