Я новичок в сценариях оболочки, и многие книги написали, что для запуска интерпретатора используется строка #! (Sha-bang) при запуске сценария. И это вызовет новую оболочку для сценария и выполнит интерпретацию строка за строкой. моего основного сценария все еще работает без магической линии.
так что мои вопросы:
- откуда мой основной сценарий получил переводчика.
- Как удалось сценарию найти переводчика.
Теперь позвольте мне рассказать вам о моем базовом скрипте, он просто содержит следующую строку:
echo "основной скрипт без магических линий"
bash
shell-script
user1678213
источник
источник
Ответы:
Если волшебная строка не указана, для запуска скрипта используется оболочка по умолчанию. Эта оболочка по умолчанию может быть либо оболочкой Bourne (sh), что имеет место в некоторых вариантах, однако в некоторых других вариантах используется оболочка по умолчанию, аналогичная оболочке входа в систему для ее выполнения. Дело в том, что не оставляйте систему на усмотрение оболочки, всегда указывайте нужную оболочку в первой строке.
источник
/bin/sh
просто для того, чтобы быть первымsh
исполняемым файлом, найденным при изучении соответствующей переменной PATH.Когда вы запускаете программу, ядро проверяет, запускается ли она какой-нибудь магической байтовой последовательностью . Если исполняемый файл начинается с
#!
, ядро интерпретирует остальную часть строки как имя интерпретатора. Если исполняемый файл начинается с\177ELF
(где\177
байт 127), он загружает файл как исполняемый файл ELF ; это нормальный вид на большинстве систем Unix в настоящее время.Если ядро не распознает формат файла, оно отказывается выполнить файл и возвращает ошибку ENOEXEC (ошибка формата Exec). Когда оболочка замечает это, она берет на себя выполнение программы в виде сценария оболочки.
Чтобы убедиться в этом, добавьте несколько команд в ваш скрипт:
(Это для Linux, настройте для других юнитов.) Затем попробуйте запустить этот скрипт из различных оболочек. Вы увидите, что некоторые оболочки порождают новые экземпляры для выполнения скрипта (bash, ksh93), в то время как другие порождают
/bin/sh
(dash, pdksh, zsh).источник
ls -l
командой? Это:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Если так, что это говорит? Кроме того , заметил , что я естьSHELL=/bin/bash
наenv
, но изменить это , похоже, не поведение изменений. Может быть, это не связано?ls -l /proc/$$/exe
на самом деле я должен был написать ). Вexe
ссылки указывает на оболочку , которая исполняющего свой сценарий. Когда вы запустите свой скрипт, вы увидите, что bash интерпретирует скрипт. Если вы запустите его, например, из pdksh, он запустится/bin/sh
. Я не знаю ни одной оболочки, которая используетSHELL
переменную окружения или оболочку входа в систему при таких обстоятельствах./etc/passwd
того, какая оболочка запускается при входе через SSH или в текстовой консоли. Это не меняет, какая оболочка может выполнять сценарии./etc/passwd
чтобы решить, какую оболочку использовать, они либо раздвоили экземпляр себя, либо выполнили/bin/sh
.Вероятно, это одна из следующих 3 возможностей:
Вы вызываете скрипт напрямую с помощью интерпретатора, т.е. IE: bash script.sh
Имя файла сценария имеет расширение .sh, которое заставляет систему искать программу по умолчанию для этого типа файла.
Среда оболочки, которую вы используете, выполняет 'echo' сама по себе, так как я могу только догадываться, что файл сценария является исполняемым. Например, если вы будете использовать оболочку bash и в своем файле есть команда, которую использует только ksh, то вы увидите, что она не будет работать.
Удачи!
источник