在 bash 循环中执行时查找“找不到命令”

Posted

技术标签:

【中文标题】在 bash 循环中执行时查找“找不到命令”【英文标题】:Find "command not found" when executed in bash loop 【发布时间】:2017-07-08 09:53:58 【问题描述】:

我正在尝试编写一个 bash 脚本来生成文件列表。我想我只是在一个循环中调用'find'。不幸的是,它在循环中产生了“find: command not found”错误,我不知道为什么。

为了简短起见,这个精简版复制了问题,而不会让我们陷入不相关的代码中。

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

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

在进行故障排除时,我添加了第一个“查找”命令……添加后,它随后在循环中工作。如果我再次将其注释掉,循环中的“查找”将恢复为抛出错误。

鉴于我要将循环输出重定向到一个文件,我可以使用额外的“查找”命令,甚至只是重定向到 null。但是,我是一个好奇的人,我真的很想找出问题所在。

感谢您的任何意见。

【问题讨论】:

对您自己的变量使用小写名称以避免覆盖对操作系统或 shell 有意义的变量——就像您在此处所做的那样。参见the relevant POSIX spec,表示全大写名称用于对shell和操作系统有意义的内置变量和环境变量,并且保留至少一个小写字符的变量名称空间供应用程序使用。 也就是说——如果你想遍历一个事物列表,你应该使用一个实际的数组,而不是设置 IFS,然后像一个数组一样分割一个字符串。 paths=( open*** vms ); for path in "$paths[@]"; do echo "processing $path"; done 谢谢查尔斯。对 Linux 来说相当新,我读过一些其他页面,这些页面建议使用大写作为变量以便于阅读,但现在它向我指出我完全理解。我也尝试过数组,但是当路径包含空格和随后包含/排除引号导致加倍时遇到了一些问题,但是现在我已经解决了这个非问题,我会回去再看看为什么我的数组是鹅毛的。 不知道为什么我的问题被否决了。这是一个菜鸟的错误,但这是一个真正的错误。有人建议我在这里做错了什么吗? 不能对反对票发表意见——但通常情况下,真正糟糕的问题会得到不止一个问题,或者被关闭,或者得到一些更有用的关于 为什么 i> 链接到帮助中心很糟糕;我不会出汗一个。 【参考方案1】:

它正在 $PATH... 中寻找 find,您的脚本已将其销毁。

【讨论】:

你没有错……真是个白痴。事实上,第一个“发现”完成了第二个工作,这意味着我完全忽略了我正在破坏我的 $PATH 谢谢!

以上是关于在 bash 循环中执行时查找“找不到命令”的主要内容,如果未能解决你的问题,请参考以下文章

-bash:iTMSTransporter:找不到命令

终端:-bash:'别名:找不到命令

-bash: git: 在 lion osx 的 Xcode 4 中找不到命令

Bash 脚本在空行上打印“找不到命令”

使用 scp 命令“bash:scp:找不到命令”时出错 [关闭]

Bash:sudo:找不到命令