1

这有效

shopt -s extglob
find /usr/!(^*|@*) -maxdepth 0 -cmin +1 -exec echo {} \;
shopt -u extglob

这会返回一个错误

syntax error near unexpected token `('

function test {
  shopt -s extglob
  find /usr/!(^*|@*) -maxdepth 0 -cmin +1 -exec echo {} \;
  shopt -u extglob
}

test

我错过了什么,这将允许我在函数中使用它?

4

1 回答 1

3

问题是 bash 需要extglob开启两次:

  1. 解析脚本时

  2. 执行实际命令时

通过将 包含shopt到函数体中, 1. 不满足。如果你扩大范围shopt以包含函数声明,bash 将正确解析函数,但在运行时会失败(即 2. 不满足):

shopt -s extglob
function test {
    find /usr/!(^*|@*) -maxdepth 0 -cmin +1 -exec echo {} \;
}
shopt -u extglob

错误:

find: ‘/usr/!(^*|@*)’: No such file or directory

所以,只需shopt extglob在脚本的开头打开就可以了。或者,如果您确实需要在其他地方关闭它,请在函数内部和外部打开和关闭它:

#! /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
于 2021-01-01T20:11:38.230 回答