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