Bash: ls命令显示文件未找到

3

我尝试了以下命令

for i in `ls`; do ls $i; done

并得到了以下输出:

ls: a.out: No such file or directory
ls: c: No such file or directory
ls: contest: No such file or directory
ls: cpp: No such file or directory
ls: java: No such file or directory
ls: : No such file or directory

由于列表中的文件也是使用ls获取的,这就令人感到困惑。当我尝试对echo执行od时,我看到了以下内容:

0000000 033 133 060 155 033 133 060 061 073 063 062 155 141 056 157 165 
        033   [   0   m 033   [   0   1   ;   3   2   m   a   .   o   u   
0000020 164 033 133 060 155 012 
          t 033   [   0   m  \n  
0000026
0000000 033 133 060 061 073 063 064 155 143 033 133 060 155 012 
        033   [   0   1   ;   3   4   m   c 033   [   0   m  \n  
0000016
0000000 033 133 060 061 073 063 064 155 143 157 156 164 145 163 164 033 
        033   [   0   1   ;   3   4   m   c   o   n   t   e   s   t 033 
0000020 133 060 155 012 
          [   0   m  \n  
0000024
0000000 033 133 060 061 073 063 064 155 143 160 160 033 133 060 155 012 
        033   [   0   1   ;   3   4   m   c   p   p 033   [   0   m  \n  
0000020
0000000 033 133 060 155 146 151 154 145 056 164 170 164 033 133 060 155 
        033   [   0   m   f   i   l   e   .   t   x   t 033   [   0   m   
0000020 012 
         \n  
0000021
0000000 033 133 060 061 073 063 064 155 152 141 166 141 033 133 060 155 
        033   [   0   1   ;   3   4   m   j   a   v   a 033   [   0   m   
0000020 012 
         \n  
0000021
0000000 033 133 155 012 
        033   [   m  \n  
0000004

这些“033 [ 0 m”字符代表什么?我应该如何避免它们?它们是这个问题的原因吗?
请帮忙解答。
谢谢, Karthick S.

"033 [ 0 m" 字符串是用于给终端输出着色的转义码。尝试使用以下代码替代它:for file in $(unset LS_COLORS \ls); do ls "$file"; done - pgl
非常感谢pgl。您能否将其变成答案,以便我可以接受它? - Karthick S
4个回答

4
您不需要使用`ls`$(ls)。您可以使用*来代替。这样,您就可以避免花哨的彩色输出,同时保持代码的可移植性、可读性和紧凑性。

3

这是在Bash陷阱中的第1个问题:绝不要将ls作为另一个命令的输入...


2
“033 [0m”这些字符是用于给终端输出着色的转义代码。请尝试使用以下代码替代:
for file in $(unset LS_COLORS \ls);
do
     ls "$file";
done

1
我期望当不在写入到终端时,ls命令不使用颜色。 - johannes
@johannes ls --color=auto 可以检查这个。默认值是 always(没有参数的--color),也可以是 never - plundra
在我的系统上,man ls 显示:“默认情况下禁用使用颜色来区分文件类型...” - johannes
这可能是一个答案,但方法有缺陷,请参见此处,并使用@mouviciel的解决方案。 - potong
@potong,你说得对,使用*是正确的方法,但这并不能解释为什么事情没有按预期发生。 - pgl

0

或者

for file in $(ls -1 -Q --quoting-style=shell --color=never);
do
    ls "$file";
done

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