命令替换在命令行上工作,但不在脚本中工作



使用ubuntu 10.10,我在命令行上运行了以下命令:

result="$(ls -d !(*.*))"
chmod +x $result

这将获得一个没有扩展名的文件列表,并使它们可执行。

但是当我将它移动到脚本文件(shell)时,它不起作用。从我在论坛上看到的情况来看,这与在不同的子shell中运行命令替换有关。

但我找不到一个解决方案,但在我的脚本工作:(

那么如何获得命令的结果并将其存储在脚本中的变量中呢?

(由于@user000001似乎没有将他们的评论写入答案,所以我将辛苦地编写答案。所以功劳应该属于他们。)

您正在使用的特性是bashextglob(扩展globbing)特性。默认情况下,交互式shell是启用的,非交互式shell(即shell脚本)是禁用的。使用shopt -s extglob命令开启。

注意这个命令只对下面的行有效。

shopt -s extglob
ls -d !(*.*)

不影响同一行的解析:

shopt -s extglob; ls -d !(*.*)   # won't work!!

总的来说,我想警告使用bash的这些特殊功能。这使得代码难以移植。我建议使用POSIX的特性和工具来代替,这些特性和工具可以很容易地将代码移植到另一个平台,并且它们也代表了更多开发人员不必先查阅文档就能理解的可能性的某个子集。

您想要实现的也可以使用find来完成。这样做还有一个好处,就是在使用奇怪的文件名(例如,包含空格、引号等)时不会出现问题:

find . -maxdepth 1 -type f -name '*.*' -o -exec chmod +x "{}" ;

最新更新