简体   繁体   中英

Shebang executable not found because of UTF-8 BOM (Byte Order Mark)

For some reason the shebang in one of my scripts does not work:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "Hello World"

When I execute this file, I get an error

 % ./test.py
./test.py: 1: #!/usr/bin/env: not found

There is no problem with the content of my /usr/bin/ directory: both env and python are there, with correct execution rights.

This is due to how Unix and Linux handle the shebang. #! must be the first two bytes in the file. If you have a BOM then this isn't true anymore hence the error.

Note that putting a BOM is completely useless from the point of view of the python interpreter, since the # -*- coding: utf-8 -*- already tells python the encoding.

AFAIK BOM is usually not used with utf-8. It is used for UTF-16 et similia in order to specify the byte-order. If the editor assumes the wrong encoding you should be able to explicitly open the file with the correct encoding.

The cause of the problem is that my file was encoded using UTF8 with BOM (Byte Order Mark).

Removing the BOM, ie encoding the file using UTF8 without BOM solves the issue.

NB: for Notepad++ users, "UTF8 without BOM" is also called (weirdly) "ANSI as UTF-8" in the editor.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM