在Bash循环中执行时出现“命令未找到”的错误提示

3

我正在尝试编写一个bash脚本来生成文件列表。我认为只需要在循环中调用'find'命令即可。但是,当在循环中调用该命令时,出现了“find: command not found”错误,我不知道为什么。

为了简洁,这个简化版本可以复制并重现问题,而不会让我们陷入无关的代码中。

#!/bin/bash
IFSprev=$IFS
IFS=$'|'
PATHS='openvpn|vms'
SOURCE='/mnt/store/'

#find "${SOURCE}vms" -type f
for PATH in ${PATHS}
do
   echo -----------------------------------
   find "${SOURCE}${PATH}" -type f
done
IFS=$IFSprev

在故障排除时,我添加了第一个“查找”命令......添加后,在循环内它随后有效。如果我再次注释它,“循环中的查找”将恢复抛出错误。
考虑到我将重定向循环输出到文件,我可以接受额外的“查找”命令,甚至只需重定向到空值。然而,我是一个好奇的人,我真的想找出问题所在。
感谢任何意见。

1
使用小写名称来命名您自己的变量,以避免覆盖具有操作系统或shell意义的变量 - 就像您在这里刚刚做的那样。请参阅相关的POSIX规范,指出全大写名称用于内置变量和对shell和操作系统有意义的环境变量,并且至少有一个小写字符的变量命名空间保留供应用程序使用。 - Charles Duffy
话虽如此--如果您想迭代处理一组事物,则应使用实际的数组,而不是设置IFS并将字符串拆分为数组。 paths =(openvpn vms); for path in“$ {paths [@]}”; do echo“处理$path”;done - Charles Duffy
谢谢Charles。我对Linux还比较新,之前读了一些页面,建议使用大写字母来表示变量以便于阅读,但现在有人指出这点,我完全理解了。我也尝试过数组,但是当路径包含空格时会出现问题,引号的包含和排除会导致重复,但现在这个问题已经解决了,我会回去再看看为什么我的数组出了问题。 - JNoob
无法对downvote发表意见 - 但通常真正糟糕的问题会得到多个downvote,或被关闭,或者得到更多有用的评论,解释为什么它不好,并提供指向帮助中心的链接; 我不会为了一个downvote而担心。 - Charles Duffy
关于与POSIX相冲突的建议的问题,不幸的是,在shell世界中存在着很多盲目模仿的现象,甚至一些被谷歌广泛引用的参考资料也存在这样的问题。我建议查看Wooledge BashGuidebash-hackers wiki这两个资源,它们通常比较可靠和一致。(在一些最佳实践方面存在争议的地方,例如set -e,一个好的资源会展示双方观点,或者至少提供其他可靠的选择)。 - Charles Duffy
显示剩余3条评论
1个回答

11

它正在寻找 $PATH 中的find命令,但是您的脚本已经将其删除了。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - JNoob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接