Источник против. почему другое поведение?

17

Я недавно узнал, что

. ./.a.aи ./.a.aто же самое.

Однако попытка source source .a.aдает ошибку. ИМО, .будучи псевдонимом Bash, sourceне должен вести себя иначе, так чего мне не хватает?

Бонус, почему все . .нормально, а source sourceнет?

LAFK говорит восстановить Монику
источник
8
Вы могли бы выбрать более четкое имя для вашего примера :). В любом случае, что дало вам представление, что это одно . scriptи ./scriptто же? Они, безусловно, нет . Кроме того, .это не псевдоним source. Это наоборот. .это стандарт и sourceпсевдоним ..
Тердон
2
Потратив некоторое время на просмотр сценариев оболочки, вы привыкаете к .команде, но я имею в виду, что sourceэто просто лучшая команда, когда вы видите source somefileв сценарии, вы сразу знаете, что делает этот оператор, но . somefile не только не очевидно, что он делает, Вы можете легко пропустить . персонажа
the_velour_fog
Бонус, почему есть. , ОК, а источник не является источником? - Насколько хорошо сообщение bash: .: .: is a directoryоб ошибке, . .должно быть объяснено.
контррежим
@terdon - абсолютно верно. Оригинальный пример должен . ./.a.a .был быть честным. : -DA вроде тестов, если вы будете. :-) Связанный вопрос - это здорово, большое спасибо. Что дало мне эту идею: тот факт, что я не видел разницы в выполнении файлов таким образом, и тот факт, что я читал где-то, .является псевдонимом для source. :-)
LAFK говорит восстановить Монику

Ответы:

27

Вы не можете просто заменить .с sourceвезде; если

. ./.a.a

работает, вы можете заменить первое .(по крайней мере, в Bash):

source ./.a.a

Второй .представляет текущий каталог, вы не можете заменить это source(особенно не ./с , sourceкак вы сделали).

source source

было бы хорошо, если бы у вас был файл, вызванный sourceв текущем каталоге, содержащий что-то значимое для вашей текущей оболочки. Я не вижу, как . .было бы хорошо ...

Кроме того, . ./.a.aи ./.a.aэто не то же самое, вторая форма запускается .a.aв отдельной оболочке. См. В чем разница между поиском ('.' Или 'source') и выполнением файла в bash? для деталей.

Стивен Китт
источник
9

sourceявляется ключевым словом оболочки, которое должно использоваться следующим образом: sourcefileгде fileсодержит допустимые команды оболочки. Эти команды оболочки будут выполняться в текущей оболочке, как если бы они вводились из командной строки. Теперь .fileделает точно так же.

Помимо этого, .означает "текущий рабочий каталог", как в ./xyz(" xyzв этом каталоге") или a/b/./c/./d(который идентичен a/b/c/d).

Кроме того, .имя файла имеет значение только в соответствии с соглашением, в .foobarкотором указывается «скрытый» файл (не совсем ...) или как в foobar.pdf, который указывает формат файла с помощью суффикса (здесь .pdf).

Эти разные значения не могут быть взаимозаменяемы.

countermode
источник
8
.ничуть не устарела. Это, в отличие sourceот переносимого, POSIX-определенного способа получения файла. sourceПсевдоним оболочки конкретным и может быть либо отсутствует (например , в dash) или ведут себя по разному от стандарта ..
Тердон
Благодаря @terdon, Wiki говорит, что источник в виде точки (.) Недопустим в оболочке C, где команда впервые появилась.
Ноам Манос
1
@NoamManos, возможно, но C-оболочка не POSIX, поэтому она может (и делает) вести себя совсем по-другому.
Terdon