在Ubuntu中以新用户身份运行脚本时出现Shell问题

dav*_*idA 2 python linux shell ubuntu dos

当我通过SSH登录到特定的Ubuntu Linux(10.04 64位)主机时,我得到了一个bash shell.从这里我可以运行一个特定的Python脚本,并设置可执行位,将其作为第一行:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

但是,如果另一个(新)用户通过SSH登录到同一主机并尝试运行此(或此副本)脚本,则会出现此错误:

$ ./script.py
: No such file or directory
Run Code Online (Sandbox Code Playgroud)

事实证明,这个文件实际上是一个DOS行结束文件,但我可以从我的登录中运行这个.如果我将其转换为UNIX格式,那么另一个人也可以运行它.

如果我们用'python'作为前缀,那么无论DOS/UNIX格式如何,该脚本对我们两个人都运行良好:

$ python ./script.py
blah blah blah...
Run Code Online (Sandbox Code Playgroud)

除此之外,一旦脚本转换为UNIX格式而另一个用户可以运行它,它仍然无法从Makefile运行 - make显示与上面相同的错误.

我读到/ bin/sh是Ubuntu中的'dash'(而不是'bash')shell,我想知道这是否与此有关,因为它的行为与bash不同.如果是这样,我想知道我的登录(完全正常并且已经完成多年)和这个新用户的登录之间的区别是什么,它显示了各种奇怪的行为.从哪里开始寻找?

也许相关 - 新用户是由Same服务(Active Directory集成客户端)自动创建的,并且该服务可能以某种方式错误地配置了新用户.

我也尝试将第一行更改为#!/ usr/bin/python,没有任何区别.

两个用户都将bash shell作为其登录shell运行.

小智 5

我遇到了同样的问题,从上面的答案中不能立即清楚问题是什么,或解决方案是什么,但我想我现在明白了.

显然,Windows换行符的编码方式略有不同.虽然cygwin可以用unix格式编码,但我使用的是Windows文本编辑器(Notepad ++)来编写我的脚本,默认格式是windows CRLF编码.Notepad ++可以重新配置为unix作为默认格式.我的同事在linux或mac机器上生成的所有脚本都可以正常工作,但之后我会在windows中编辑它们,直到我尝试在linux机器上运行它时才会出现问题.

首先,这可以通过cygwin或bash诊断:

cat -v file.py
Run Code Online (Sandbox Code Playgroud)

如果它是DOS格式,那么每一行最后会有一个^ M.

其次,cygwin有一个简单的转换器:

d2u file.py
Run Code Online (Sandbox Code Playgroud)

并且您可以检查是否在第一步中起作用.然后我的所有脚本都会像往常一样运行.