代码之家  ›  专栏  ›  技术社区  ›  davidA

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

  •  2
  • davidA  · 技术社区  · 14 年前

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

    #!/usr/bin/env python
    

    $ ./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不同。如果是的话,我想知道我的登录(工作非常好,已经做了很多年)和这个新用户的登录(显示了各种奇怪的行为)之间的区别。从哪里开始寻找?

    也可能是相关的-新用户是由类似的服务(一个Active Directory integration客户机)自动创建的,可能是这个服务以某种方式错误地配置了新用户。

    我也试过把第一行改成#!/usr/bin/python没有区别。

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   WRF    13 年前

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

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

    首先,这可以在cygwin或bash中诊断为:

    cat -v file.py
    

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

    d2u file.py
    

    你可以检查一下第一步的效果。 然后我所有的脚本都会像往常一样运行。

        2
  •  3
  •   Dennis Williamson    14 年前

    env 执行 python^M 这是不存在的。 还是这样? 如果您有一个名为 在你的 $PATH (但不是其他用户的)这就解释了这种奇怪的行为。做 type -a python^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

        3
  •  2
  •   davidA    14 年前

    我已经解决了这个问题,我将自己回答,以确保完整。

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

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

    谢谢大家的回复。