web-dev-qa-db-ja.com

シェルスクリプトが失敗する:構文エラー: "("予期しない

私はRaspberry Pi開発用の開発環境のセットアップを自動化するスクリプトに取り組んできました(機能する詳細な手順は here です)。スクリプトはその記事にリンクされていますが、便利です here も見つかります。ここで、このスクリプトを実行してエラーなしで環境をセットアップすると、デフォルトでSudoのタイムアウト値により、Sudoパスワードを複数回入力する必要があります。したがって、私はすべてのSudo行を削除し、コマンドラインで次のようにSudoを介してスクリプト全体を実行することで実験を開始しました。

kemra102@ubuntuvm:~$ Sudo ./pi_dev_env_install.sh

これは期待どおりに正常に機能し、この時点までほとんどの手順を実行できます。

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

これで、Sudoでスクリプト全体を実行しない場合、この行は以前は正常に機能していました。この行がSudoとして実行されていて、私の知る限り動作を停止させるものは何もありません。誰かアイデアはありますか?

70
kemra102

スクリプトは Shebang 行で始まっていないため、システムは/bin/shを使用してスクリプトを実行します。 Ubuntuでは、/bin/shダッシュ であり、標準の機能のみを備えた高速な起動と実行のために設計されたシェルです。ダッシュが68行に達すると、構文エラーが表示されます。つまり、括弧はコンテキストで何も意味しません。

ダッシュ(他のすべてのシェルと同様)はインタープリターであるため、実行が問題のある行に到達するまで文句は表示されません。したがって、テストのある時点でスクリプトが正常に開始されたとしても、68行目に到達するとスクリプトは異常終了します。

シバン行は、ファイルの最初の行でなければなりません。 bash機能を使用するため、ファイルの最初の行は#!/bin/bashまたは#!/usr/bin/env bashである必要があります。

Shebangが最初の行にない場合、rootユーザーのシェル、Shell変数、または-sフラグに関係なく、Shebangは尊重されません。これは簡単な例で簡単に確認できます。

#
#!/bin/bash
offfset=(`ls`)
echo $offset

このスクリプトをSudoで実行すると、UbuntuとDebianの最近のバージョンで構文エラーが発生します。

スクリプトがbashによって確実に解釈されるようにするには、2つのオプションがあります。

  1. シバンを最初の行に移動します

  2. 次のようにSudoを実行します。

    Sudo bash ./pi_dev_env_install.sh
    
7
janos

私にとってスクリプトを開始するには:

bash ./< script file > 

正常に動作します。

1
my.coolmac

多分あなたはディレクトリまたはファイル名に「(」を持っています。

0
mauro

これは、意図したインタープリターをオーバーライドした場合に発生する可能性があります。たとえば、これは使用されているハッシュバンに関係なくshで実行されます(ハッシュバンを使用しない場合に便利です)。

> sh run.sh

またはbashを実行するには:

> bash run.sh

スクリプトで定義されたハッシュバン値を使用するには、次のようにします。

> ./run.sh
0
Kc Gibson

スクリプトファイルでdos2unixを試してください。ソースに隠し文字が含まれている場合があります。

コマンド:

dos2unix script_file.sh script_file.sh
0
M Sarfraz