Ответ 1
Давайте начнем с того, как работает путь команды и когда он используется. Когда вы запускаете команду, например:
ls /tmp
Здесь ls
не содержит символа /, поэтому оболочка ищет каталоги в вашем пути к команде (значение переменной среды PATH) для файла с именем ls
. Если он находит один, он выполняет этот файл. В случае с ls
он обычно находится в /bin
или /usr/bin
, и оба этих каталога обычно находятся на вашем пути.
Когда вы выдаете команду с/в командном слове:
/bin/ls /tmp
Оболочка не ищет путь к команде. Он выглядит специально для файла /bin/ls
и выполняет это.
Запуск ./A
- пример запуска команды с именем /. Оболочка не ищет путь к команде; он выглядит специально для файла с именем ./A
и выполняет это. "" является сокращением для вашего текущего рабочего каталога, поэтому ./A
относится к файлу, который должен находиться в вашем текущем рабочем каталоге. Если файл существует, он запускается как любая другая команда. Например:
cd /bin
./ls
будет работать для запуска /bin/ls
.
Бег . A
. A
- пример поиска файла. Файл должен быть текстовым файлом, содержащим команды оболочки. Он выполняется текущей оболочкой без запуска нового процесса. Файл, который будет найден, найден таким же образом, как и команды. Если имя файла содержит /, то оболочка считывает определенный файл, который вы назвали. Если имя файла не содержит /, то оболочка ищет его в пути к команде.
. A # Looks for A using the command path, so might source /bin/A for example
. ./A # Specifically sources ./A
Таким образом, ваш скрипт пытается выполнить . B
. B
и не заявляет, что B
не существует, хотя там есть файл с именем B
прямо в вашем текущем каталоге. Как обсуждалось выше, оболочка искала бы ваш командный путь для B
потому что B
не содержал никаких символов. При поиске команды оболочка не выполняет автоматический поиск текущего каталога. Он ищет только текущий каталог, если этот каталог является частью пути к команде.
Короче говоря . B
. B
, вероятно, не работает, потому что у вас нет "." (текущий каталог) в вашем пути к команде, а скрипт, пытающийся установить источник B
, предполагает, что "." является частью вашего пути. На мой взгляд, это ошибка в скрипте. Многие люди бегут без "." на их пути, и сценарий не должен зависеть от этого.
Редактировать:
Вы говорите, что сценарий использует ksh
, в то время как вы используете bash
. Ksh следует стандарту POSIX - фактически, KSH является основой стандарта POSIX и всегда ищет путь к команде, как я описал. У Bash есть флаг под названием "Режим POSIX", который контролирует, насколько строго он соответствует стандарту POSIX. Если не в режиме POSIX - как это обычно используют люди, bash проверяет текущий каталог для файла, который будет использоваться, если он не найдет файл в пути к команде.
Если вы должны запустить bash -posix
и запустить . B
. B
в этом примере bash, вы должны обнаружить, что это не сработает.