拡張ワイルドカードオプションを含む 'cp'ステートメントを 'if'ブロックに移動すると、構文エラーが発生します。

拡張ワイルドカードオプションを含む 'cp'ステートメントを 'if'ブロックに移動すると、構文エラーが発生します。

Bashからコピーするのに問題があります。これはうまくいきます:

# Enable extended globbing and include filenames beginning with a '.'
shopt -s extglob dotglob
# Copy git repo to expected place
cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/

しかし、if私がこれについて述べたとき:

if [ -z "$FROM_JENKINS" ]; then
    # FROM_JENKINS is blank, this is a local build

    # Enable extended globbing and include filenames beginning with a '.'
    shopt -s extglob dotglob
    # Copy git repo to expected place
    cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/
fi

私は得る:

./build.sh: line 80: syntax error near unexpected token `('

80行はcp括弧を削除すると機能します。

    cp -r . $POKY_DIR/$GIT_REPO_NAME/

if文が括弧内の文と同じではないのはなぜですかcp

答え1

問題は、読んで実行する順序と「範囲」です。

ブロックif全体は単なる命令です。したがって、シェルはコマンドを実行する前にコマンドを読み取る必要があります。

これはルールを意味するいいえ shopt -s extglob dotglob(ここではすべての内容ではない行に言及しています。ilkkachuがコメントで指摘したように:dotglob質問には関係ありません。)ifブロックが終わるまで有効です。なぜなら、ブロックshoptが終了した後にのみ実行されるからです。そうでなければ違法shopt -s extglobです!(

shoptしたがって、前に移動する必要がありますif(およびelse四半期から元に戻すこともできます)。

関連情報