Shebang line C.它是如何工作的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shebang line C.它是如何工作的?相关的知识,希望对你有一定的参考价值。

我正在阅读UNIX中的高级编程,并偶然发现了这个例子。什么是shebang线在这里做什么?这是代码的顶部。

#!/usr/bin/awk -f
BEGIN   {
    printf("#include "apue.h"
")
    printf("#include <errno.h>
")
    printf("
")
    printf("static void pr_sysconf(char *, int);
")
    printf("static void pr_pathconf(char *, char *, int);
")
    printf("
")
    printf("int
")
    printf("main(int argc, char *argv[])
")
    printf("{
")
    printf("	if (argc != 2)
")
    printf("		err_quit("usage: a.out <dirname>");

")
    FS="	+"
    while (getline <"sysopt.sym" > 0) {
        printf("#ifdef %s
", $1)
        printf("	printf("%s is defined (val is %%ld)\n", (long)%s+0);
", $1, $1)
        printf("#else
")
        printf("	printf("%s is undefined\n");
", $1)
        printf("#endif
")
        printf("#ifdef %s
", $2)
答案

shebang可以理解execve(2)系列(在Linux和大多数Unix上)。但是,POSIX没有指定任何内容。你的脚本应该由例如GNU awk,假设脚本是一个可执行文件(你可能希望它可以从你的PATH variable访问)。

所以当某个东西(可能是你的Unix shell,但可能是其他的东西)正在用execve那个脚本执行时,/usr/bin/awk程序就会被执行。你打赌这个awk程序是AWK的一些实现

另一答案

操作系统执行文件的例程在文件开头查找两个字符#!,如果存在,而不是直接将文件作为二进制可执行文件加载,它们会调用该行的其余部分引用的可执行文件,以及其中有任何命令行参数,然后将原始文件作为最终参数。

这是一个非常复杂的描述;几个例子让它更清晰:

如果myFile包含:

#!/bin/echo My path is

......我们让它可执行:

$ chmod +x myFile

...然后当我们运行它时,我们得到:

$ ./myFile
My path is /home/slim/myFile

或者,如果我们将其内容更改为:

#!/bin/cat
Hello
world

然后,当我们运行它时,它打印自己......

$ ./myFile
#!/bin/cat
Hello
world

当它调用的命令是一个可以处理内容的解释器时,这通常很有用,并且它本身忽略了shebang。当然,在许多语言中,#表示评论,因此我们免费获得:

#!/bin/bash
#!/usr/bin/perl
#!/bin/awk -f

所以基本上它排列的问题是直接运行myFile,相当于运行awk -f myFile

以上是关于Shebang line C.它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Shebang Line (Python 虚拟环境)

bash 在运行作为参数传递的文件时忽略 shebang

如何使用 webpack 保持我的 shebang 到位?

The 13th Chinese Northeast Contest C. Line-line Intersection(平面几何)

如何使用带有 shebang 的 awk 的多个参数(即#!)?

获取魔术线/shebang中指定的编码(来自模块内)