Разница между поиском (. test.sh
) сценария и его выполнением (test.sh
или ./test.sh
) заключается в первой строке.
Если вы используете исходный текст сценария, первая строка является только комментарием и игнорируется. Но если вы запустите его, ядро проверяет первую строку на наличие первых двух символов, и если они " #!
msgstr ", остальная часть строки будет использоваться как путь и первый аргумент для интерпретатора. То есть ядро будет искать исполняемый файл с именем /bin/bash
и передавать ему имя скрипта в качестве первого аргумента. Вот так : /bin/bash ./test.sh
.
Это то, что обычно происходит, и вы правы, это должно иметь тот же эффект для вашего сценария. Но ваш скрипт содержит проблему: первая строка заканчивается окончанием строки DOS (CR LF) вместо окончания строки unix (LF). Таким образом, имя интерпретатора, как видит ядро, это /bin/bash^M
которого нет на вашем диске (^ M означает ложный CR перед окончанием строки). Что еще хуже, символ ^ M обычно невидим.
Вы можете доказать, что это имеет место с cat -v test.sh
(который печатает замену ^ M для невидимого символа CR).