The problem is bash needs extglob to be turned on at two times:
when parsing the script
when executing the actual command
By including the shopt into the function body, 1. is not satisified. If you broaden the scope of the shopt to include the function declaration, too, bash will parse the function correctly, but it will fail when running it (i.e. 2. is not satisfied):
shopt -s extglob
function test {
find /usr/!(^*|@*) -maxdepth 0 -cmin +1 -exec echo {} \;
}
shopt -u extglob
The error:
find: ‘/usr/!(^*|@*)’: No such file or directory
So, just turn shopt extglob on at the beginning of the script and that's it.
Or, if you really need it to be off elsewhere, turn it on and off both inside and outside the function:
#! /bin/bash
shopt -s extglob
function test {
shopt -s extglob
find /usr/!(^*|@*) -maxdepth 0 -cmin +1 -exec echo {} \;
shopt -u extglob
}
shopt -u extglob
test