11

Кто-нибудь может мне объяснить, что делает оболочка в двух примерах А) и Б) ниже? Это, очевидно, ведет себя по-разному, но я не могу выяснить, почему результат отличается.

Пример:
Давайте создадим скрипт в нашем текущем каталоге с именем bla.sh только одной командой:
echo ${0##/*} hello

A)
Начинается как: ./bla.sh
дает: ./bla.sh hello

B)
Начинал . bla.sh
дает: -bash hello

Поскольку я использую это в скрипте, второй вывод (из-за «-» перед -bash) убивает команду. Конечно, все просто -- прежде чем ${...} помогло, но я бы хотел понять, что в первую очередь является причиной выхода.
Я люблю Баш. И ви [м]. Но я отвлекся ...

3 ответа3

22
./bla.sh

Здесь команда ./bla.sh . Это заставляет оболочку искать исполняемый файл с именем bla.sh в текущем каталоге, а затем просит ядро запустить его как обычную программу, отдельно от оболочки. (Не имеет значения, является ли bla.sh bash , perl или python или скомпилированным двоичным файлом .)


. bla.sh

Здесь команда есть . (он же source), встроенная команда вашей оболочки. Это заставляет оболочку искать файл с именем bla.sh в системном пути ($ PATH) и интерпретировать содержимое, как если бы оно было напечатано вами; все это делается в том же процессе, что и сама оболочка (и, следовательно, может влиять на внутреннее состояние оболочки).

Это, конечно, работает только тогда, когда bla.sh содержит команды для оболочки bash (если это та, которую вы сейчас используете), она не будет работать для сценариев perl или чего-либо еще.

(Это объясняется в help . И в help source тоже.)


Как . и ./ - это совершенно разные вещи (команда против части пути), их можно, конечно, комбинировать - используя . ./bla.sh будет "источником" файла bla.sh в текущем каталоге.


Обычно лучше всего использовать метод ./bla.sh . Обычно получаются только ~/.bashrc , ~/.profile и такие файлы, потому что они должны изменять текущую среду.

7

./<cmd> запустит программу <cmd> которая находится в текущем каталоге, в новом (разветвленном) процессе. Это должно быть исполняемым. И также читается это начинается с #! ,

. <cmd> заставит вашу текущую оболочку выполнять скрипт оболочки <cmd> который находится в вашем $PATH или текущем каталоге в текущем процессе оболочки. Это должно быть читабельным. Это псевдоним source команд оболочки.

1

./cmd использует явный путь (./ - текущий каталог ) к исполняемому файлу. И не обязательно, чтобы это начиналось с #! ,

. cmd - (он же source) - встроенная команда bash. Одним из видимых отличий выполнения через source является то, что он может устанавливать / изменять переменную окружения текущей оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .