我知道.sh bash脚本的开头是

#!/bin/bash

指向命令插入程序可执行文件。

但是在观看Google Python类http://www.youtube.com/watch?v=tKTZoB2Vjuk时,我注意到他们使用的是python
#!/usr/bin/python -tt

。在网上冲浪时,我也发现了这种表示法的样式:
#!/usr/local/bin/python

乃至
#!/usr/bin/env python



因此,我是Python的新手,我是普通的Linux用户,并且对“魔术”这一行有一些疑问:
  • 首先,此行的正确形式是什么?为什么呢?
  • -tt键在#!/usr/bin/python -tt中是什么意思?
  • 在Linux中,什么程序正在解析此行?
  • 对于任何脚本,此行的语法是什么?
  • 如果每个文件都有扩展名,为什么这一行很必要?
  • 那么,对于每种脚本,每种计算机解释器中的存储位置将与其他位置不同?而且脚本无法运行。

  • 对我来说真的很有趣。
    这是什么线?为什么这条线?如何写这行?为什么这样呢?

    最佳答案

    问题#1)这条线称为shebang,没有正确的形式可以普遍使用。例如

    #!python
    #!/usr/bin/python
    #!/usr/local/bin/python
    #!/usr/bin/python -t
    

    是所有有效/可接受的表格,但可能不适用于所有系统:

    仅当python可执行文件位于您的Shell路径中的某个位置时,#!python才有效
    #!/usr/bin/python仅在python二进制文件实际位于/usr/bin中时才有效
    #!/usr/local/bin/python也仅在python在/usr/local/bin中时有效

    问题2)
    #!/usr/bin/python -tt正在将-tt选项传递给python,就像您已经完成的一样:
    $ python -t somescript.py
    

    在shell提示下。您可以在shebang行上将任意的命令行参数传递给解释器。

    问题#3)

    该行由OS内核和您当前使用的Shell解释。 #!之后的内容只是告诉OS应该启动哪个程序以“执行”脚本的其余部分。

    问题#4)

    脚本语法取决于您使用的语言。例如。 PHP Shell脚本必须采用以下形式:
    #!/usr/bin/php
    <?php
      ... php code here ...
    
    #!/usr/bin/perl perl脚本必须使用Perl语法,等等...如果将PHP代码与Perl shebang一起使用,您将只是用语法错误将Perl插入脚本,因为PHP代码是不是 perl代码

    问题#5)

    Shebangs是用于Unix系统的,文件扩展名从未真正用于标识操作系统的文件类型。 .c文件被理解为C语言源代码文件,但这仅是一个约定。您可以将Bash Shell脚本放入.c文件中,使其可执行,然后使用#!/bin/bash shebang,它将作为Bash脚本执行。

    在Windows中,通过文件扩展名确定可执行文件的类型更多。

    问题#6)

    这回溯了问题#1的内容-如果shebang声称解释器位于路径之外的其他路径上,则只有在shebang固定或解释器移动之后,才能执行此特定脚本。 Shebangs非常方便,但并非万无一失。

    幸运的是,如今大多数解释器都安装在相当标准的位置,因此找到(说)Perl安装在/some/wonky/weird/path而不是/usr/bin有点不寻常。

    10-06 13:42
    查看更多