Bash在for循环中抱怨“没有这样的文件或目录”

3
我有一个在变量list_of_files里的文件列表。如果我运行以下命令:
for file_path in $list_of_files; do
  echo "=${file_path}="
done

它给我这个

=./a.py=
=./b.py=
=./c.py=

这意味着file_path是文件的相对路径,前后没有任何多余的空格。

但如果我使用cat而不是echo,它会报错"找不到文件或目录"

for file_path in $list_of_files; do
  cat ${file_path}
done

但有趣的是,如果我直接调用cat命令cat ./a.py,它就可以工作。

这不是cat命令特定的问题。事实证明,如果我使用if语句来检查文件是否存在,它会告诉我这些文件不存在。

for file_path in $list_of_files; do
  if [ -f "$file_path" ]
  then
    echo 'OK'
  else
    echo 'NO'
  fi
done

结果:

NO
NO
NO

尝试了以下方法,但均未成功。

  • 使用完整绝对路径
  • 从所有文件路径中删除./

1
野生猜测 - 确保$list_of_files中没有任何多余/不正确的行终止符(\r\n\n)。 - keithmo
2
1: 在你的脚本中添加一个 pwd 命令,以验证你所在的目录是否正确。 2: 在你的脚本中添加一个 set -x 命令,以打印每个被执行的命令 -- 它们看起来合理吗? - Snild Dolkow
1
脚本内部能否使用 cat ./a.py 命令? - Karoly Horvath
你应该拥有命令od(它在大多数Linux安装中都有)。使用man od测试是否已经安装了手册,如果手册已经安装,则该命令也应该被安装。如果是这样的话,那么执行以下命令:echo "$list_of_files" | od -An -tcx1 并将结果发布在此处。这将显示变量可能包含的任何奇怪字符。 - user2350426
1
@BinaryZebra哦,那太有趣了!所以$list_of_files实际上是有颜色的。它包含一些特殊字符用于着色目的,但是被隐藏起来了! - John Wu
显示剩余5条评论
1个回答

3
原因是$list_of_files被着色了。所以它包含了一些用于着色但被隐藏的特殊字符!
我发现使用echo "$list_of_files" | od -An -tcx1 (感谢@BinaryZebra),它会显示所有垃圾信息,这些信息会给文件名着色。
通过使用sed -r "s:\x1B\[[0-9;]*[mK]::g",我排除了那些神奇的字符!

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