Co właściwie robi `\ time`,` t \ ime` i `\ cd`? (zabawa z ukośnikami w muszlach)


9

Omawiając różnice między /usr/bin/timewbudowanym shellem (bash i zsh) time, ktoś wspomniał, że można go użyć \timejako skrótu /usr/bin/time.

Najpierw wydawało się to miłym, niewinnym skrótem, ale potem pojawiły się pytania:

  • Dlaczego też t\imedziała?
  • Dlaczego \cdzmienia katalog, chociaż /usr/bin/cd¹ tego nie robi?

Oczywiście \foonie jest to równoważne $(which foo). Pytanie brzmi teraz:

Czy zaobserwowane zachowanie \foozarówno w bash, jak i zsh w jakikolwiek sposób jest objęte definicją powłoki POSIX, a jeśli tak, to dlaczego zachowuje się tak jak on?


Przypis 1: /usr/bin/cdw moim systemie jest

#!/bin/sh
builtin cd "$@"

Zobacz także unix.stackexchange.com/questions/12762/... Zauważ, że \ polecenie jest specjalnie udokumentowaną funkcją tcsh, która mówi, aby ignorować aliasy dla polecenia.
simpleuser

Odpowiedzi:


14

t\imelub \cd(lub "tim"elub 'cd'lub ${-##*}timei ${-+time}i każda inna kombinacja cytatów i rozwinięć, o których można by pomyśleć, ostatecznie rozwiązałaby się na timelub cd), jest: innym sposobem pisania cdi time.

Jednak ostatecznie rozwiązałoby to parsowanie i interpretację składni powłoki cdlub timew późniejszym czasie. W szczególności dzieje się to długo po rozpoznaniu słowa kluczowego powłoki i podstawieniu aliasu .

Tak więc, w tym czasie powłoka szuka słów kluczowych w swoim języku, to nie uznając ti\mejako timesłowo kluczowe powłoki. Więc:

ti\me echo test

będą rozpoznawane przez powłokę jako proste polecenie w przeciwieństwie do timesłowa kluczowego, po którym następuje proste polecenie.

Wówczas cytowanie ti\mezostanie przetworzone (tutaj odwrotny ukośnik cytuje mznak, który i tak nie wymaga cytowania, znak cytowania jest usuwany, otrzymujesz time), a time polecenie byłoby wyszukiwane jak każde inne polecenie (na liście poleceń wbudowanych , funkcje i pliki wykonywalne w $PATH. Najprawdopodobniej będą /bin/timetutaj)

Bo w języku powłoki cdnie ma cdsłowa kluczowego, tylko cdwbudowane polecenie (które ma pierwszeństwo przed twoim /usr/bin/cd). Jeśli jednak zdefiniujesz alias cd(podobny alias cd=pushd), to samo ponownie. Ponieważ podstawianie aliasów odbywa się bardzo wcześnie, przed usunięciem cytatu, jeśli masz alias dla, cda nie jeden dla \cd(zauważ, że niewiele powłok pozwala na aliasy z odwrotnymi ukośnikami), a następnie pisz:

\cd dir

upewniasz się, że Twój cdalias nie jest podstawiony.

W skrócie, podając nazwę polecenia lub jakiejkolwiek jego części uniemożliwia postrzegane jako słowo kluczowe powłoki (słowa kluczowe są takie rzeczy jak while, for, if, {... timejest to słowo kluczowe w niektórych tylko muszli), a omija aliasu może masz dla niego .

Jednak nie zmusza tego polecenia do przetworzenia pliku wykonywalnego $PATH, polecenie jest nadal wyszukiwane najpierw wśród funkcji (które można obejść, wykonując command time cmd...) i wbudowanych (które można obejść, wykonując env time cmd..., chociaż nie wiem o powłoka, która ma wbudowane timepolecenie).

Zauważ, że cytowanie może również wpływać na zachowanie specjalnych wbudowań rodziny typeset/ declare/ export/ local... w niektórych powłokach. Zobacz: Czy do przypisania zmiennych lokalnych potrzebne są oferty? dla szczegółów.


Więc różnica między timei cdktóra prowadzi do różnicy w obserwowanym zachowaniem jest to, że timejest to słowo kluczowe i cdto polecenie wbudowane ?
Jonas Schäfer

1
@JonasWielicki, to timejest słowo kluczowe, a cdnie jest. (a jeśli masz alias dla cdlub time, to będzie inna sprawa). To cdjest wbudowane lub nie ma w tym momencie żadnego wpływu (jeśli chodzi o wpływ cytowania). Niektóre powłoki mają jednak kilka wbudowanych plików, które znajdują się w połowie drogi między słowami kluczowymi a wbudowanymi, ponieważ ich parsowanie odbywa się inaczej niż w przypadku innych wbudowanych. Tak jest w przypadku export/ typeset/ declare. Powinienem chyba dodać notatkę na ten temat w tej odpowiedzi.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.