Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 作为新用户在Ubuntu中运行脚本时出现的Shell问题_Python_Linux_Shell_Ubuntu_Dos - Fatal编程技术网

Python 作为新用户在Ubuntu中运行脚本时出现的Shell问题

Python 作为新用户在Ubuntu中运行脚本时出现的Shell问题,python,linux,shell,ubuntu,dos,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行结束文件,但我可以从我的登录运行这个

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

#!/usr/bin/env python
但是,如果另一个(新)用户通过SSH登录到同一主机并尝试运行此(或此)脚本的副本,则会出现以下错误:

$ ./script.py
: No such file or directory
事实证明,这个文件实际上是一个DOS行结束文件,但我可以从我的登录运行这个罚款。如果我将它转换为UNIX格式,那么其他人也可以很好地运行它

无论DOS/UNIX格式如何,如果我们在脚本前面加上“python”前缀,那么脚本对我们两人都可以正常运行:

$ python ./script.py
blah blah blah...
除此之外,一旦脚本转换为UNIX格式并且其他用户可以运行它,它仍然无法从Makefile运行-make显示与上面相同的错误

我读到/bin/sh是Ubuntu中的“dash”(而不是“bash”)shell,我想知道这是否与此有关,因为它的行为与bash不同。如果是这样的话,我想知道我的登录(它工作得很好,已经运行了很多年)和这个新用户的登录(它显示了各种奇怪的行为)之间有什么区别。从哪里开始寻找

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

我还试着把第一行改成#/usr/bin/python没有区别


两个用户都在运行bashshell作为他们的登录shell。

问题在于,为什么您可以在不进行转换的情况下运行它。所有其他行为都是预期的,因为您的shebang告诉
env
执行
python^M
,而这并不存在。还是这样?如果在
$PATH
中有一个名为
python^M
的符号链接或脚本(但在其他用户中没有),则可以解释这种奇怪的行为。执行
键入-a python ^M
(按Ctrl-V然后按Ctrl-M生成
^M


如果您将shebang更改为
#/usr/bin/python
应该有所不同。你应该得到
-bash:./script.py:/usr/bin/python^M:bad解释器:没有这样的文件或目录,而不是
:没有这样的文件或目录

我已经解决了这个问题,我将自己回答完整性问题

问题源于我们在Cygwin/Windows上使用的git,core.autocrlf=true。我们这样做有各种原因,改变也不是小事

登录Linux机器的原始新用户还将其Cygwin.gitconfig(其中包含core.autocrlf=true)复制到了新帐户中。然后他们克隆了包含有问题的python脚本的git存储库。我没有在原始问题中包含此信息,因为我根本没有建立连接。我不想通过解释那些看似无关的事情来混淆问题。事后诸葛亮,嗯

无论如何,这使得所有的脚本都是克隆DOS格式,这就解释了为什么没有任何东西可以正常工作给这个用户。它还解释了为什么错误消息没有用处,因为^M回车符将光标返回到没有换行符的行的开头,然后“没有这样的文件或目录”将覆盖消息的有用部分。当我在没有权限的情况下设置目录的路径时,我发现了这一点,并收到了损坏的消息“permission deniedn”-这个流氓“n”让我思考

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


谢谢大家的回复。

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

显然,窗口换行符的编码略有不同。虽然cygwin可以以unix格式编码,但我使用windows文本编辑器(Notepad++)编写脚本,默认格式是windows CRLF编码。可以将Notepad++重新配置为unix的默认格式。我的同事在linux或mac机器上生成的所有脚本都可以正常工作,但随后我会在windows中编辑它们,直到我尝试在linux机器上运行一个脚本,我才意识到可能存在问题

首先,可以通过以下方式在cygwin或bash中诊断:

cat -v file.py
如果是DOS格式,则每行末尾将有一个^M

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

d2u file.py
你可以检查一下这是否和第一步一样有效。
然后我的所有脚本都会像往常一样运行。

您是否安装了
/usr/bin/env
/usr/bin/env python
是否从命令行运行?另外,shell的名称是“bash”。@s.Lott:其中一个shell名为“bash”。OP指的是Ubuntu系统上默认的
sh
提供者,即Debian Almquist SHell(
dash
)。尝试了第三个用户,也是新用户(因此同样使用不同的名称创建了一个新帐户),该用户没有问题。问题似乎与第一个新用户无关。@S.Lott:Yes,/usr/bin/env已安装,并且/usr/bin/env python确实从命令行运行。顺便说一句,Ubuntu中有两个常用的shell-bash通常是登录shell,dash通常是“sh”shell。@meowsqueak:请不要评论。请更新您的问题以包含所有事实。您提供了我需要破解此问题的线索-我主要关心的是为什么其他用户没有得到相同的行为。它变成