【问题标题】:Shebang line C. How does it work?社邦线C.它是如何运作的?
【发布时间】:2018-05-04 12:56:39
【问题描述】:

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

#!/usr/bin/awk -f
BEGIN   {
    printf("#include \"apue.h\"\n")
    printf("#include <errno.h>\n")
    printf("\n")
    printf("static void pr_sysconf(char *, int);\n")
    printf("static void pr_pathconf(char *, char *, int);\n")
    printf("\n")
    printf("int\n")
    printf("main(int argc, char *argv[])\n")
    printf("{\n")
    printf("\tif (argc != 2)\n")
    printf("\t\terr_quit(\"usage: a.out <dirname>\");\n\n")
    FS="\t+"
    while (getline <"sysopt.sym" > 0) {
        printf("#ifdef %s\n", $1)
        printf("\tprintf(\"%s is defined (val is %%ld)\\n\", (long)%s+0);\n", $1, $1)
        printf("#else\n")
        printf("\tprintf(\"%s is undefined\\n\");\n", $1)
        printf("#endif\n")
        printf("#ifdef %s\n", $2)

【问题讨论】:

  • 为什么这个标签是 [c]?看起来它发出了一些 c 代码,但在其他方面不相关。
  • 这意味着这个文件是一个可执行命令,由程序/usr/bin/awk执行(解释)。 (这就是#! 行的含义。)

标签: unix awk shebang


【解决方案1】:

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

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

【讨论】:

  • 学究起来,它不一定要由 GNU awk 运行,只要您在 /usr/bin/awk 中安装的任何 awk 实现即可。
  • 这就是我写e.g.GNU awk的原因
【解决方案2】:

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

这是一个相当复杂的描述;举几个例子就更清楚了:

如果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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多