0

我有一些 python 文件windows,我gentoo通过 samba 将它们传输到我的。

我检查他们的模式是可执行的,我用./xxx.py它来运行它,但得到一个错误:

: 没有相应的文件和目录

我很困扰它没有提示什么文件不在此处。

但是当我使用时python xxx.py,它可以以正确的方式运行。

然后我set ff在vim中使用检查CR字符,发现它是dos,然后我用set ff=unix它来设置它,现在它可以通过使用运行./xxx.py

但我不知道为什么它可以在什么python xxx.py时候使用ff=dos

4

2 回答 2

3

Windows 行结尾是 CRLF 或\r\n.

Unix 简单地使用\n.

当操作系统读取您的 shebang 行时,它会看到#!/usr/bin/python\r. 它无法运行此命令。

从 unix shell 中查看此行为的一种简单方法是$(echo -e 'python\r')(尝试python\r作为命令运行)。此输出也将类似于: command not found

Windows 下的许多高级代码编辑器都支持以 unix 行结尾进行本机保存。

于 2012-12-02T12:11:04.277 回答
2

DOS 文件以 CR+LF 结束行,Unix 文件仅以 LF 结束。这意味着当 Unix 读取您的文件以找出可执行文件的名称时,该可执行文件的名称以 CR 结尾。像这样:

#!/usr/bin/python

print("Blah!")

当我运行时,我得到:

$ ./test.py 
bash: ./test.py: /usr/bin/python^M: bad interpreter: No such file or directory

在您的情况下发生的情况是 CR 字符(上面的 ^M)没有打印出来,而是由您的终端“执行”,即光标将返回到行首。因此, ^M 之前的所有内容都会被覆盖:

$ ./test.py 

:错误的解释器:没有这样的文件或目录

这就是为什么您不能执行以 Unix 结尾的 DOS 文件的原因。

任何甚至远程的现代源代码控制系统都会为您处理这个问题,并在您签出源代码时更改文件结尾。

于 2012-12-02T12:16:01.653 回答