В системе обычно установлено несколько интерпретаторов разных языков программирования. Например, в моей системе:
По пути /usr/bin/perl установлен интерпретатор perl, по пути /usr/bin/python3 установлен интерпретатор python, а по адресу /usr/bin/bash - интерпретатор bash.
В шебанге (первой строчке, которая начинается с #!) пишешь путь до того интерпретатора, которым будешь выполнять свою программу. Система отправит содержимое файла по указанному пути. Интерпретатор, когда получит содержимое файла, первую строчку (с шебангом) проигнорирует. Она ему в этот момент будет уже не нужна.
Т.е. если в качестве примера взять исполняемые текстовый файл
#!/usr/bin/python3
print("Hello World!")
То система, исходя из первой строчки (шебанга), "скормит" содержимое интепретатору, который находится по адресу /usr/bit/python3, а сам интерпретатор Пайтона первую строчку уже пропустит и выдаст на выход Hello World
Но зачем ее выполнять если получается интерпритатор уже читает файл скрипта.