extglob
複合化合物内でシェルオプションを設定すると、後続のアンチグロブが失敗することがわかりました。シェルオプションは、複合コマンドの外部で設定する必要がありますか?私はbashのmanページにそのような要件の兆候を見ませんでした。
例として、次のスクリプトは正常に機能します(prints a.0 a.1
)。
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
ただし、最後の2行が複合コマンドとして実行されると、スクリプトは次のエラーで失敗します。
syntax error near unexpected token `('
` ls "a."!(b*)'
これは、4.2から4.4までのbashバージョンを使用して、さまざまな複合コマンドでテストされました。
(1)条件付き- if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2)ブレース- { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3)サブシェル- ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
すべてのケースで、shopt
が複合コマンドの外に移動された場合、スクリプトは成功します。