Co oznacza kropka ułamkowa odwrócona jako polecenie?

17

Zainstalowane oprogramowanie wstawiło wiersz do mojego profilu, który brzmi:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

Wiem, że kropka .jest synonimem source, więc podejrzewam, że to tylko źródło pliku, ale nigdy \.wcześniej go nie widziałem ; czy robi coś innego?

Edycja w odniesieniu do DV: wyszukiwanie „kropki z odwrotnym ukośnikiem” prowadzi do pytań dotyczących ./wywoływania plików wykonywalnych i man sourceprowadzi do strony podręcznika, na której \.się nie pojawia. Nie wiem, co jeszcze spróbować, stąd pytanie.

Edycja 2: zobacz powiązane pytania

Sheljohn
źródło

Odpowiedzi:

31

Odwrotny ukośnik poza cudzysłowami oznacza „interpretuj następny znak dosłownie podczas analizowania”. Ponieważ .jest to zwykły znak dla analizatora składni, \.jest analizowany w taki sam sposób, jak .i wywołuje funkcję wbudowaną .(której sourcesynonimem jest bash).

Jest jeden przypadek, w którym może to zmienić w tym kontekście. Jeśli użytkownik zdefiniował .wcześniej wywołany alias .profilei .profilejest odczytywany w powłoce, która rozwija aliasy (co domyślnie bash robi tylko wtedy, gdy jest wywoływany interaktywnie), wówczas .wyzwala alias, ale \.nadal wyzwala wbudowane, ponieważ powłoka nie próbuje rozszerzenia aliasu na słowa, które były cytowane w jakikolwiek sposób.

Podejrzewam, że .zmieniono to, \.ponieważ użytkownik złożył skargę po utworzeniu aliasu ..

Zauważ, że \.wywołałoby funkcję o nazwie .. Prawdopodobnie użytkownicy piszący funkcje są bardziej kompetentni niż użytkownicy piszący aliasy i wiedzieliby, że przedefiniowanie standardowego polecenia .profilejest złym pomysłem, jeśli zamierzasz dołączyć kod stron trzecich. Ale jeśli chcesz ominąć zarówno aliasy, jak i funkcje, możesz pisać command .. Autor tego fragmentu też tego nie zrobił, ponieważ troszczył się o antyczne muszle, które nie miały commandwbudowanego, lub bardziej prawdopodobne, ponieważ nie byli tego świadomi.

Nawiasem mówiąc, zdefiniowanie dowolnego aliasu .profilejest złym pomysłem, ponieważ .profilejest to skrypt inicjujący sesję , a nie skrypt inicjujący powłokę . Należą do niej aliasy dla bash .bashrc.

Gilles „SO- przestań być zły”
źródło
9

\.Jest „dosłowny kropka”, czyli po prostu kropka. Zostanie on przyjęty jako standardowe .polecenie (podobne do sourcewejścia bash).

Standard POSIX ma to do powiedzenia na ten temat (moje podkreślenie)

A, <backslash>który nie jest cytowany, zachowuje literalną wartość następującego znaku , z wyjątkiem a <newline>. Jeśli po nim <newline>następuje <backslash>, powłoka interpretuje to jako kontynuację linii. I powinny zostać usunięte przed dzielenia wejście do tokenów . Ponieważ znak ucieczki jest całkowicie usuwany z danych wejściowych i nie jest zastępowany białą spacją, nie może służyć jako separator tokenów.<backslash><newline><newline>

Znak kropki może być aliasowany:

$ alias .='echo hello'
$ .
hello

co oznacza, że \.będzie unikać używania aliasem wersję .polecenia, ponieważ ,

Po rozgraniczeniu tokena, ale przed zastosowaniem reguł gramatycznych w gramatyce powłoki, powstałe słowo, które jest identyfikowane jako słowo nazwy polecenia prostego polecenia, zostanie zbadane w celu ustalenia, czy jest to niecytowany , prawidłowy alias.

Kusalananda
źródło
Szukałem oficjalnego źródła o tym, jak odwrotny ukośnik w słowie jest interpretowany jako cytowanie i jak zapobiega to ekspansji aliasu. Dzięki za referencje!
Sheljohn,
1
@Sheljohn Zobacz zaktualizowaną odpowiedź.
Kusalananda