我在windows
中有一些python文件,我将它们通过samba传输到我的gentoo
。
我检查他们的模式是可执行的,我使用./xxx.py
来运行它,但是收到错误:
:没有这样的文件或目录
我感到困扰的是它没有提示哪个文件不在这里。
但是当我使用python xxx.py
时,它可以以正确的方式运行。
然后我在vim中使用set ff
检查CR字符,发现它是dos
,然后我使用set ff=unix
来设置它,现在它可以使用{{ 1}}
但我不知道为什么./xxx.py
可以使用python xxx.py
?
答案 0 :(得分: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行结尾本地保存。
答案 1 :(得分: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文件的文件。
任何甚至远程现代的源代码控制系统都会为您处理此问题,并在您签出源代码时更改文件结尾。