我读到我必须把命令
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 bash
本SHELL BUILTIN COMMANDS
节中,或通过 shell 的在线帮助
help shopt
1虽然不太透明,但通过 bash 补全。例如,参见在我的交互式 shell 中,bash 的“shopt extglob”在哪里打开?