Я пытаюсь работать с существующей библиотекой кода, но столкнулся с проблемой. Короче говоря, я выполняю скрипт оболочки (позвольте назвать это 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