Системный вызов exec
ядра Linux изначально понимает шебанги(#!
)
Я не заметил, что OP спрашивал об AIX, я собираюсь сказать, что я знаю о Linux, и держу пари, что есть сильные аналогии или, по крайней мере, удовлетворят большинство гуглеров, которые ищут Linux:-)
Когда вы делаете на bash:
./something
в Linux вызывает системный вызов exec
с путем ./something
.
Эта строка ядра вызывается для файла, переданного вexec
:https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
Он читает самые первые байты файла и сравнивает их с #!
.
Если сравнение верно, то оставшаяся часть строки анализируется ядром Linux, которое выполняет еще один exec
вызов с путем /usr/bin/env python
и текущим файлом в качестве первого аргумента:
/usr/bin/env python /path/to/script.py
, и это работает для любого языка сценариев, который использует #
в качестве символа комментария.
И да, вы можете сделать бесконечный цикл с помощью:
printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a
Bash распознает ошибку:
-bash: /a: /a: bad interpreter: Too many levels of symbolic links
#!
просто удобочитаемо для человека, но это не обязательно.
Если бы файл начинался с других байтов, то системный вызов exec
использовал бы другой обработчик. Другой наиболее важный встроенный -обработчик предназначен для исполняемых файлов ELF :https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305, который проверяет байты 7f 45 4c 46
(, которые также могут быть читаемы человеком для.ELF
). Давайте подтвердим это, прочитав 4 первых байта /bin/ls
, который является исполняемым файлом ELF:
head -c 4 "$(which ls)" | hd
выход:
00000000 7f 45 4c 46 |.ELF|
00000004
Таким образом, когда ядро видит эти байты, оно берет файл ELF, корректно помещает его в память и запускает с ним новый процесс. См. также:https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under-linux/31394861#31394861
Наконец, вы можете добавить свои собственные обработчики shebang с помощью механизма binfmt_misc
. Например, вы можете добавить пользовательский обработчик для .jar
файлов .Этот механизм даже поддерживает обработчики по расширению файла. Другое применение — прозрачный запуск исполняемых файлов другой архитектуры с помощью QEMU .
Однако я не думаю, что POSIX определяет шебанги :https://unix.stackexchange.com/a/346214/32558, хотя упоминает об этом в разделах обоснования и в форме "если исполняемые скрипты поддерживаются системой, что-то может произойти".
Если есть возможность «перестроить» вашу структуру, вы можете сделать что-то вроде этого
jq '.Vpcs[]|select(.OwnerId!="abc")|{Vpcs: [.]}'