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

时间:2015-09-08 08:04:42

标签: linux bash ubuntu ubuntu-10.10

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

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

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

但是当我将它移动到脚本文件(shell)时,它不起作用。根据我在论坛上阅读的内容,这与命令替换在不同的子shell中运行有关。

但我找不到一个可以解决问题的解决方案:(

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

1 个答案:

答案 0 :(得分:2)

(因为@ user000001似乎没有在评论中写下他们的评论,所以我会写下答案。所以应该得到他们的信任。)

您使用的功能是extglob的{​​{1}}(扩展通配)功能。对于交互式shell,默认情况下启用此选项,对于非交互式shell(即shell脚本),默认情况下禁用此选项。要启用它,请使用命令bash

请注意,此命令仅对下面的行有效:

shopt -s extglob

它不会影响同一行的解析:

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

一般来说,我想警告使用shopt -s extglob; ls -d !(*.*) # won't work!! 的这些特殊功能。它使代码相当不可移植。我建议使用POSIX功能和工具,它们可以很容易地将代码移植到另一个平台,它们也代表了更多开发人员理解的某些可能性,而无需先查阅文档。

您想要实现的目标也可以使用bash来完成。这也具有与奇怪的文件名(例如包含空格,引号等)相结合而没有问题的优点:

find