繁体   English   中英

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

[英]Command Substitution working on command line but not in script

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

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

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

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

但是我还没有找到在我的 scrpt 中有效的解决方案:(

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

(由于@user000001 似乎没有将他们的评论写成答案,我会努力写答案。所以应该归功于他们。)

您正在使用的功能是bashextglob (扩展通配)功能。 这是默认为交互式 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 "{}" \;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM