Как отфильтровать содержимое массива json, но сохранить родителя с jq?

Системный вызов 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, хотя упоминает об этом в разделах обоснования и в форме "если исполняемые скрипты поддерживаются системой, что-то может произойти".

1
29.01.2020, 22:35
1 ответ

Если есть возможность «перестроить» вашу структуру, вы можете сделать что-то вроде этого

jq '.Vpcs[]|select(.OwnerId!="abc")|{Vpcs: [.]}'
1
28.04.2021, 23:25

Теги

Похожие вопросы