我试图在 bash 脚本中从当前目录复制一些文件,但问题是该cp
命令不适用于当前目录。我可以在 Backtrack 5(基于 Ubuntu)上使用以下命令,没有任何问题,但在 Kali linux(基于 Debian)上则不行:
cp -f -v *.{html,txt,php} /var/www/
我可以通过首先将目录更改为这些文件所在的目录来直接从终端执行此命令。但使用脚本时出现以下错误:
cp -f -v *.{html,txt,php} /var/www/
cp: cannot stat `*.{html,txt,php}': No such file or directory
当我使用 Ubuntu 时,我再次在脚本中使用这个命令没有问题。
答案1
您的脚本解释器设置为/bin/sh
.在展开括号列表的系统上,您将 Bourne Again shell 用作/bin/sh
.在将大括号视为普通(非元)字符并抱怨通配符不匹配任何内容的系统上,您将 Debian Almquist shell 用作/bin/sh
.您的交互式登录 shell 几乎肯定/bin/bash
在两个系统上都是明确的。
如果要在脚本中使用 POSIX shell 语言的此类扩展,则必须将脚本解释器设置为支持它们的 shell 的实际名称。相反,如果您要/bin/sh
在不同的系统中用作脚本解释器,则应严格遵守符合 POSIX 的 shell 语法。
进一步阅读
- https://superuser.com/a/696310/38062
- 破折号为
/bin/sh
。 Ubuntu 维基。 - 破折号为
/bin/sh
。 Debian 维基。 - 巴什主义。格雷格的维基。
- 《词的扩展》。 外壳命令语言。 IEEE 标准 1003.1。第 7 期。开放组。
答案2
cannot stat `*.{html,txt,php}'
来自的错误消息cp
表明:
- 不存在匹配的文件,或者
- 您使用的外壳不进行大括号扩展。
您在命令失败的系统上使用哪个 shell?如果不是 bash 而是 sh 或 dash,那么这可以解释您所看到的内容。您可以尝试给出命令*.html *.txt *.php
而不是大括号模式。