Линия Шебанга C. Как это работает? - PullRequest
0 голосов
/ 04 мая 2018

Я читал Расширенное программирование в UNIX и наткнулся на этот пример. Что здесь делает линия Шебанга? Вот верхняя часть кода.

#!/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)

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Подпрограммы ОС для выполнения файла ищут два символа #! в начале файла, и, если они присутствуют, вместо прямой загрузки файла в виде двоичного исполняемого файла, они вызывают исполняемый файл, на который ссылаются остальные эта строка вместе с любым аргументом командной строки, а затем исходный файл в качестве последнего аргумента.

Это довольно сложное описание; пара примеров поясняют это:

Если 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

Это обычно полезно, когда команда, которую она вызывает, является интерпретатором, который может работать с содержимым и сам игнорирует шебанг. Конечно, на многих языках # обозначает комментарий, поэтому мы получаем его бесплатно:

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

Так что, по сути, он организует такие вещи, что прямой запуск myFile эквивалентен запуску awk -f myFile.

0 голосов
/ 04 мая 2018

Строка shebang (в Linux и большинстве Unixes) понимается как execve (2) . Тем не менее, POSIX не указывает ничего об этом. Ваш скрипт должен быть запущен, например, GNU awk, при условии, что скрипт является исполняемым файлом (и вы, вероятно, хотите, чтобы он был доступен из вашей PATH переменной ).

Таким образом, когда что-то (возможно, ваша оболочка Unix, но может быть что-то еще) выполняется с execve этим сценарием, программа /usr/bin/awk запускается. Вы держите пари, что эта awk программа является некой реализацией AWK

...