Выполнение файла с точечным пространством и точечной косой чертой

Я пытаюсь работать с существующей библиотекой кода, но столкнулся с проблемой. Короче говоря, я выполняю сценарий оболочки (давайте назовем этотA) чьяпервый акт это вызвать другой скрипт (B). скриптB находится в моем текущем каталоге (требование программы, которую я использую). Руководство по программному обеспечению делает ссылку наbashОднако комментарии вA предположить, что это было разработано вksh, Я работал вbash до сих пор.

внутриA, строка для выполненияB это просто:

. B

Для вызова программы используется синтаксис «точка». Это не делает ничего необычного, какsudo.

Когда я звонюA без точечного синтаксиса, т.е.

./A

это всегда ошибки, говорящие, что это не может найти файлB, я добавилpwd, ls, whoami, echo $SHELL, а такжеecho $PATH линии кA отладить и подтвердил, чтоB на самом деле прямо здесь, скрипт работает с тем же$SHELL как я в командной строке, сценарий тот же пользователь, что и я, и сценарий имеет тот же путь поиска$PATH как я. Я также проверил, если я делаю:

. B

в командной строке работает просто отлично. Но если я изменю синтаксис внутриA чтобы:

./B

вместо этого тогдаA выполняется успешно.

Точно так же, если я выполнюA с точечным синтаксисом, то оба. B а также./B Работа.

подведение:
./A работает только еслиA содержит./B синтаксис.
. A работает наA либо с./B или же. B синтаксис.

Я понимаю, что использование точечного пространства (т.е.. A) синтаксис выполняется без разветвления для подоболочки, но я не понимаю, как это может привести к поведению, которое я наблюдаю, учитывая, что файл явно находится прямо здесь. Я что-то упускаю из-за нюансов синтаксиса или рабочих областей родительского / дочернего процесса? Магия?

Update1: Добавлена ​​информация о том, что сценарий может быть разработан вkshпока я пользуюсьbash.
UPDATE2: Добавлена ​​проверка для подтверждения$PATH та же.

Update3: Сценарий говорит, что он был написан дляksh, но он работает вbash, В ответ на ответ Кенстера я обнаружил, что бегbash -posix затем. B не удается в командной строке. Это означает, что разница между средами между командной строкой и сценарием заключается в том, что последний работаетbash в POSIX-совместимом режиме, а командная строка - нет. Глядя немного ближе, я вижу это вbash man страница:

Когда вызывается как sh, bash переходит в режим posix после чтения файлов запуска.

shebang заA это действительно#!/bin/sh.

В итоге, когда я бегуA без синтаксиса точечного пространства он разветвляется на свою собственную подоболочку, которая находится в POSIX-совместимом режиме, потому чтоshebang является#!/bin/sh (вместо, например,#!/bin/bash, Это критическое различие между средами командной строки и среды выполнения сценария, которое приводит кA будучи не в состоянии найтиB.

Ответы на вопрос(1)

Ваш ответ на вопрос