Я пытаюсь работать с существующей библиотекой кода, но столкнулся с проблемой. Короче говоря, я выполняю скрипт оболочки (позвольте назвать это A), первым действием которого является вызов другого скрипта (B). Script B находится в моем текущем каталоге (требование программы, которую я использую). В руководстве по программному обеспечению делается ссылка на bash, однако комментарии в A предполагают, что он был разработан в ksh. До сих пор я работал в bash.
Внутри A линия для выполнения B просто:
. B
Он использует синтаксис "dot space" для вызова программы. Это не делает ничего необычного, как sudo.
Когда я вызываю A без синтаксиса пространственного пространства, то есть:
./A
это всегда ошибки, говорящие, что он не может найти файл B Я добавил pwd, ls, whoami, echo $SHELL и echo $PATH в A для отладки и подтвердил, что B на самом деле там, скрипт работает с тем же $SHELL что и я в командной строке, скрипт это тот же пользователь, что и я, и сценарий имеет тот же путь поиска $PATH что и я. Я также проверял, выполняю ли я:
. B
в командной строке он работает отлично. Но если я изменил синтаксис внутри A до:
./B
вместо этого A успешно выполняется.
Аналогично, если я выполняю A с синтаксисом с пространственным пространством, тогда и то, и другое . B . B и ./B.
Подведение итогов: ./A работает только в том случае, если A содержит синтаксис ./B. . A . A работает для A с ./B или . B . B синтаксис.
Я понимаю, что использование синтаксиса точечного пространства (т . A Е. . A) выполняется без наложения на подоболочку, но я не вижу, как это может привести к поведению, которое я наблюдаю, учитывая, что файл явно прямо там. Есть ли что-то, что мне не хватает в отношении нюансов синтаксиса или рабочих областей родительского/дочернего процессов? Магия?
UPDATE1: добавлена информация о том, что сценарий, возможно, был разработан в ksh, в то время как я использую bash.
UPDATE2: Добавлена проверка для проверки $PATH.
UPDATE3: сценарий говорит, что он написан для ksh, но он работает в bash. В ответ на ответ Кенстера я обнаружил, что бежит bash -posix . B . B не работает в командной строке. Это указывает на то, что разница в средах между командной строкой и скриптом заключается в том, что последний работает в режиме bash в режиме, совместимом с POSIX, тогда как в командной строке нет. Посмотрев немного ближе, я вижу это на странице bash man:
Когда вызывается как sh, bash переходит в режим posix после чтения файлов запуска.
shebang для A действительно #!/bin/sh.
В заключение, когда я запускаю A без синтаксиса пространственного пространства, он разворачивается к своей подоболочке, которая находится в режиме POSIX-совместимого режима, потому что shebang - это #!/bin/sh (вместо, например, #!/bin/bash. является критическим различием между средами командной строки и сценариев, которые приводят к тому, что A не может найти B