bash测试产生"echo:command not found"

Chr*_*ian 6 testing bash command echo

好吧,有趣的事情突然发生了.这个测试

for i in `cat /mnt/usb/liste.txt `; do [ -f /mnt/usb/lsdvd.xml/$i ] || echo $i; done
Run Code Online (Sandbox Code Playgroud)

以前工作正常(对于文件中的每个条目,liste.txt尝试查找相应的目录,如果找不到则打印名称)并用于生成缺少的目录名称.现在这个命令产生了

 echo: command not found
 echo: command not found
 echo: command not found
(...)
Run Code Online (Sandbox Code Playgroud)

我尝试使用[[...]]和"test"而不是"[..]",但无济于事.

在我不看的时候,我心爱的bash可能发生了什么想法:)?

谢谢,克里斯蒂安

编辑(设置-x输出):

(...)
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_GHOST_WRITER.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_IMAGINARIUM_OF_DOCTOR_PARNASSUS.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_INFORMANT.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_INTERNATIONAL.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_MEN_WHO_STARE_AT_GOATS.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_OTHER_MAN.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_QUEEN.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_READER.lsdvd.xml ']'
+ for i in '`cat /mnt/usb/liste.txt`'
+ '[' -f /mnt/usb/lsdvd.xml/THE_REBOUND.lsdvd.xml ']'
+ $'\302\240echo' THE_REBOUND
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/bin/python /usr/lib/command-not-found -- $'\302\240echo'
 echo: command not found
+ return 127
(...)
Run Code Online (Sandbox Code Playgroud)

Mik*_*kel 19

如果你仔细观察,你会看到它正在打印:

 echo: command not found
Run Code Online (Sandbox Code Playgroud)

领先的空间,而不是:

echo: command not found
Run Code Online (Sandbox Code Playgroud)

set -x 打印时更清晰:

$'\302\240echo' THE_REBOUND
Run Code Online (Sandbox Code Playgroud)

0302 0240对于不间断的空间,是八进制UTF-8 .

尝试删除之间的空间|echo并键入一个正常的空间.


有可能,该文件是在Mac上编辑的,如果你同时按下Option,可能会意外输入一个不间断的空间Space.

如果您正在使用Vim,则可以使用listchars选项使非破坏空间更明显.例如:

set listchars+=nbsp:% list
Run Code Online (Sandbox Code Playgroud)

请参阅使Vim突出显示可疑字符以获取更多想法.

在Linux上,不间断的空间是Compose Space Space或者Ctrl+ Shift+ ua0,所以你可能不会意外地输入它.


对于任何感兴趣的人,可以使用UTF-8维基百科文章中的UTF-8表将八进制字节手动转换为UTF-8 .

但到目前为止,我发现最简单的方法是使用Python:

>>> import unicodedata
>>> unicodedata.name('\302\240'.decode('utf-8'))
'NO-BREAK SPACE'
Run Code Online (Sandbox Code Playgroud)


bta*_*bta 2

当你简单地跑步时会发生什么:

for i in `cat /mnt/usb/liste.txt `; do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

一方面,您是否注意到文件名有任何异常(空格、换行符、特殊字符等)?如果是这样,您将需要引用文件名以防止 shell 错误解释它。

另外,尝试使用普通if语句而不是逻辑 OR:

for i in `cat /mnt/usb/liste.txt `; do
    if [ ! -f /mnt/usb/lsdvd.xml/$i ]; then
        echo $i
    fi
done
Run Code Online (Sandbox Code Playgroud)