Źródło vs. dlaczego inne zachowanie?

17

Niedawno się tego nauczyłem

. ./.a.ai ./.a.ajest taki sam.

Jednak próba source source .a.apowoduje błąd. IMO, .będąc pseudonimem Bash, sourcenie powinno zachowywać się inaczej, więc czego mi brakuje?

Bonus, dlaczego jest . .OK, podczas gdy source sourcenie jest?

LAFK mówi Przywróć Monikę
źródło
8
Mogłeś wybrać bardziej przejrzystą nazwę dla swojego przykładu :). W każdym razie, cokolwiek podsunęło ci ten pomysł . scripti ./scriptsą tym samym? Z pewnością nie są . Ponadto .nie jest aliasem do source. Jest na odwrót. .jest standardem i sourcejest aliasem ..
terdon
2
Po spędzeniu czasu na przeglądaniu skryptów powłoki przyzwyczajasz się do .polecenia, ale mam na myśli, że sourcejest to po prostu lepsze polecenie, kiedy widzisz source somefilew skrypcie, od razu wiesz, co robi to polecenie, ale . somefile nie tylko nie jest oczywiste, co robi, możesz łatwo ominąć . postać całkowicie
the_velour_fog
Bonus, dlaczego tak jest. . OK, podczas gdy źródło nie jest? - w jakim stopniu komunikat o błędzie bash: .: .: is a directoryna . .to ok należy wyjaśnić.
kontr-
@terdon - absolutnie racja. Oryginalny przykład miał . ./.a.a .być szczery. : -DA rodzajów quizu, jeśli chcesz. :-) Połączone pytanie jest niesamowite, wielkie dzięki. Co dało mi ten pomysł: fakt, że nie widziałem żadnej różnicy w wykonywaniu plików w ten sposób i fakt, że gdzieś czytałem, .jest pseudonimem source. :-)
LAFK mówi Przywróć Monikę

Odpowiedzi:

27

Nie można po prostu wymienić .się sourcewszędzie; gdyby

. ./.a.a

działa, możesz zastąpić pierwszy .(przynajmniej w Bash):

source ./.a.a

Drugi .reprezentuje bieżący katalog, nie można zastąpić, że z source(zwłaszcza nie ./z sourcetak zrobiłeś).

source source

byłoby OK, gdybyś miał plik wywołany sourcew bieżącym katalogu, zawierający coś znaczącego dla twojej bieżącej powłoki. Nie widzę, jak . .by było OK ...

Ponadto, . ./.a.ai ./.a.anie są takie same, druga forma działa .a.aw osobnej powłoce. Zobacz Jaka jest różnica między pozyskiwaniem („.” Lub „source”) a uruchamianiem pliku w bash? dla szczegółów.

Stephen Kitt
źródło
9

sourceto słowo kluczowe powłoki, które powinno być używane w ten sposób: sourcefilegdzie filezawiera prawidłowe polecenia powłoki. Te polecenia powłoki będą wykonywane w bieżącej powłoce, tak jakby zostały wpisane z wiersza poleceń. Teraz .filerobi dokładnie to samo.

Poza tym .sam oznacza „bieżący katalog roboczy” jak w ./xyz(„ xyzw tym katalogu”) lub a/b/./c/./d(który jest identyczny a/b/c/d).

Poza tym .w nazwie pliku ma znaczenie jedynie konwencją, ponieważ .foobaroznacza „ukryty” plik (nie tak naprawdę…) lub jak w foobar.pdf, co oznacza format pliku poprzez przyrostek (tutaj .pdf).

Te różne znaczenia nie mogą być zamieniane.

przeciwdziałanie
źródło
8
.nie jest w żadnym wypadku przestarzałe. W przeciwieństwie sourcedo przenośnego, zdefiniowanego przez POSIX sposobu pozyskiwania pliku. sourceAlias danej powłoki i mogą być albo nie występuje (na przykład dash), lub odmiennie od normy ..
terdon
Dzięki @terdon, Wiki mówi, że źródło w postaci kropki (.) Jest niedopuszczalne w powłoce C, gdzie polecenie pojawiło się po raz pierwszy.
Noam Manos
1
@NoamManos może, ale powłoka C nie jest POSIX-em, więc może (i zachowuje się) zupełnie inaczej.
terdon