通配符扩展在命令行中有效,但在 Bash 脚本中无效

通配符扩展在命令行中有效,但在 Bash 脚本中无效

我读到我必须把命令

shopt -s extglob

以便.bashrc用作!(XYZ)当前目录中除 XYZ 之外的所有内容的通配符扩展。测试表明

cp -aruv !(XYZ) $target

确实将当前目录中的所有内容复制到了 $target,除了子目录 XYZ。然后我在 bash 脚本中包含了 cp 语句。脚本在 cp 语句处终止并显示错误消息

cp: invalid option --'h'

我无法解释。我在脚本中添加了 shopt 命令,得到了相同的结果。

我在 Das 的《Your UNIX》中找到了此通配符扩展,其中有注释,要求将 shopt 语句添加到 .bashrc。但shopt在 man 和 info 中均未找到。

任何帮助都将不胜感激,以便在 bash 脚本语句中获取正确的通配符扩展,以及在何处查找有关 shopt 命令的信息。

我曾尝试回答一些关于我剧本的问题,但回答错了。剧本中有部分内容。

#!/bin/bash
if shopt -s extglob
then
    echo "shopt was successful"
else
    echo "shopt was not successful"
    exit -1
fi 

这些语句后面是一个循环,其中设置并测试目标和源以确保它们指向目录。然后失败的代码

cd $source
cp -aruv !(XYZ) $target 

我再次指出,如果我从命令行设置目标和源,然后

cd $source
cp -aruv !(XYZ) $target

复制工作如我所料。我可以用其他方式完成此操作,但我想了解为什么这在我的脚本中不起作用以及如何修复它。

答案1

如果你使用默认的 Ubuntu~/.bashrc文件,则默认启用扩展通配符1 用于交互式 shell- 这就是它在命令行上起作用的原因。

但是,在脚本中,你需要使用以下命令启用它

shopt -s extglob

shopt记录在man bashSHELL BUILTIN COMMANDS节中,或通过 shell 的在线帮助

help shopt

1虽然不太透明,但通过 bash 补全。例如,参见在我的交互式 shell 中,bash 的“shopt extglob”在哪里打开?

相关内容