Джерело проти чому інша поведінка?


17

Нещодавно я дізнався, що

. ./.a.aі ./.a.aте саме.

Однак спроба source source .a.aвидає помилку. IMO, .будучи псевдонімом Баша, sourceне повинен поводитись інакше, так що мені не вистачає?

Бонус, чому . .гаразд, поки source sourceнемає?


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робить точно так само.

Крім того, .означає «поточний робочий каталог», як у ./xyzxyzу цьому каталозі») або a/b/./c/./d(що ідентично a/b/c/d).

Крім цього, .у назви файлу є значення лише за умовами, оскільки в .foobarньому вказується "прихований" файл (насправді ...) або як у foobar.pdf, що вказує на формат файлу за допомогою суфіксу (тут .pdf).

Ці різні значення неможливо змінити.


8
.аж ніяк не застаріла. Це, на відміну sourceвід портативного, визначеного POSIX способу пошуку файлу. sourceІм'я користувача оболонки конкретним і може бути або відсутній (наприклад , в dash) або поводяться по різному від стандарту ..
тердон

Завдяки @terdon, Wiki каже, що джерело як крапка (.) Неприйнятне в оболонці C, де команда вперше з'явилася.
Ноам Манос

1
@NoamManos, можливо, але C-оболонка не є POSIX, тому вона може (і справді) вести себе дуже інакше.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.