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

时间:2010-11-02 21:00:07

标签: python linux shell ubuntu dos

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

#!/usr/bin/env python

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

$ ./script.py
: No such file or directory

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

如果我们使用'python'作为前缀,那么无论DOS / UNIX格式如何,脚本也可以运行正常:

$ python ./script.py
blah blah blah...

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

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

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

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

两个用户都在运行 bash shell作为其登录shell。

3 个答案:

答案 0 :(得分:5)

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

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

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

cat -v file.py

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

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

d2u file.py

您可以查看是否与第一步相同。 然后我的所有脚本都会照常运行。

答案 1 :(得分:3)

这个谜团是你能够在没有转换的情况下运行它的原因。所有其他行为都是预期的,因为你的shebang告诉env执行不存在的python^M或者是吗?如果你的python^M(但不是其他用户)中有一个名为$PATH的符号链接或脚本,则可以解释这种奇怪的行为。执行type -a python^M(按Ctrl-V然后按Ctrl-M生成^M)。

如果您将shebang更改为#!/usr/bin/python,那么应该是一个区别。您应该-bash: ./script.py: /usr/bin/python^M: bad interpreter: No such file or directory而不是: No such file or directory

答案 2 :(得分:2)

我已经解决了这个问题,为了完整起见,我将自己回答。

问题源于我们在Cygwin / Windows上使用git,core.autocrlf = true。我们出于各种原因这样做,改变是非常重要的。

登录Linux计算机的原始新用户还将其包含core.autocrlf = true的Cygwin .gitconfig复制到其新帐户。然后他们克隆了包含有问题的python脚本的git存储库。我没有在原始问题中包含此信息,因为我根本没有建立连接。我不想通过解释似乎无关紧要的事情来混淆这个问题。后见之明呃?

无论如何,这使得所有的克隆DOS格式的脚本都解释了为什么没有什么能够适用于这个用户。它还解释了为什么错误消息没有用,因为^ M回车字符将光标返回到没有换行的行的开头,然后“没有这样的文件或目录”覆盖了消息的有用部分。当我将PATH设置为没有权限的目录时,我发现了这一点,并且收到了损坏的消息“权限被拒绝” - 流氓'n'让我思考。

所以我最初的假设是我们都运行相同的脚本(因为它们都来自同一个git存储库)是错误的 - 我们实际上根本没有运行相同的脚本。对于我们大多数人来说,它是一个UNIX格式的python脚本,但对于这一个用户,它是DOS格式。事实证明最终是一个非常简单的问题,但我们再一次被Windows相关问题所困扰。不会是最后一次。

感谢大家的回复。