Перейти к содержимому

Вызов сценария с ./bla.sh против. bla.sh

11

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

Пример:
у нас будет скрипт в нашем текущем каталоге, названный bla.shтолько одной командой:
echo $ hello

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

Б)
Начинается как: . bla.sh
дает:-bash hello

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

2 227 просмотров
Wolf спросил 16 лет назад
W 2 280

3 ответа

22
Принятый ответ
./bla.sh 

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


. bla.sh 

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

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

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


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


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

Более того, если вы измените среду bash в bla.sh, эти изменения будут учтены после. бла.ш но не после ./bla.sh. это потому что . Bla.sh работает в контексте текущего bash, тогда как ./bla.sh работает как подпроцесс.

mouviciel · 16 лет назад · 3

Смотрите также http://mywiki.wooledge.org/BashFAQ/060 для некоторых примеров. Обратите внимание, что source является псевдонимом bash для ., а не наоборот, и source не будет работать в других оболочках.

mrucci · 16 лет назад · 1
grawity ответил 16 лет назад
G 229 123
7

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

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

-1 `. `будет искать программу в` $ PATH` и, если она не найдена, ТОГДА будет искать в текущем каталоге.
dogbane · 13 лет назад · 0

@ Dogbane Правильно, я исправил это.

kmkaplan · 13 лет назад · 0

FWIW, не все оболочки будут искать cwd для поиска скриптов. zsh (по крайней мере с моим конфигом) требует . . / Cmd

bstpierre · 13 лет назад · 0

@bstpierre Кажется, это движущаяся площадка. У меня есть ссылка на POSIX, в которой говорится, что «оболочка должна использовать путь поиска, указанный в PATH» и «Некоторые более старые реализации искали файл в текущем каталоге, даже если значение PATH запрещало его».

kmkaplan · 13 лет назад · 1
kmkaplan ответил 13 лет назад
K 324
1

./cmd uses explicit path (./ - current dir) to executable. And it is not necessary that it starts with #!.

. cmd - (aka source) - bash builtin command. One visible difference of executing through source is that it can set/modify environment variable of current shell.

точнее, source является псевдонимом только для bash для . (который является стандартным)

grawity · 13 лет назад · 0

Вы правы. Исправлена.

Leonid Volnitsky · 13 лет назад · 0
Leonid Volnitsky ответил 13 лет назад
L 4 803