Cosa fanno realmente `\ time`,` t \ ime` e `\ cd`? (divertente con le barre rovesciate nelle conchiglie)


9

Durante la discussione sulle differenze tra /usr/bin/timee la shell (bash e zsh) incorporata time, qualcuno ha detto che si può usare \timecome scorciatoia per ottenere /usr/bin/time.

All'inizio sembrava una bella scorciatoia innocente, ma poi sono arrivate alcune domande:

  • Perché t\imefunziona anche tu?
  • Perché \cdcambia la directory, anche se /usr/bin/cd¹ no?

Quindi, ovviamente, \foonon è equivalente a $(which foo). La domanda ora è:

Il comportamento osservato \foosia in bash che in zsh è in qualche modo coperto dalla definizione POSIX di una shell e, in tal caso, perché si comporta in questo modo?


Nota 1: /usr/bin/cdsul mio sistema è

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

Vedi anche unix.stackexchange.com/questions/12762/… Nota che \ command è specificamente documentato tcsh funzionalità che dice di ignorare gli alias per il comando.
simpleuser

Risposte:


14

t\imeo \cd(o "tim"eo 'cd'o ${-##*}timeoe ${-+time}ogni altra combinazione di quotazioni ed espansioni che potresti pensare che alla fine si risolveranno in timeo cd), è quella: un altro modo di scrivere cde time.

Tuttavia, ciò alla fine si risolverebbe cdo timein un momento successivo dell'analisi e dell'interpretazione della sintassi della shell. In particolare, ciò avviene molto tempo dopo il riconoscimento shell parola e alias sostituzione avvengono.

Quindi, nel momento in cui la shell cerca parole chiave nella sua lingua, non la riconosce ti\mecome timeparola chiave shell. Quindi a:

ti\me echo test

sarebbe riconosciuto dalla shell come un semplice comando in contrapposizione alla timeparola chiave seguita da un semplice comando.

Quindi la quotazione ti\meverrà elaborata (qui che la barra rovesciata sta citando il mcarattere che non ha bisogno di quotare comunque, il carattere di quotatura viene rimosso, ottieni time) e un time comando verrebbe cercato come qualsiasi altro comando (nell'elenco dei builtin , funzioni e file eseguibili in $PATH. Molto probabilmente quello sarà /bin/timequi)

Per cd, non c'è una cdparola chiave nel linguaggio shell, solo un cdcomando incorporato (che ha la precedenza sul tuo /usr/bin/cd). Tuttavia, se si definisce un alias per cd(like alias cd=pushd), lo stesso di nuovo. Poiché la sostituzione dell'alias viene eseguita molto presto, prima della rimozione delle virgolette, se si dispone di un alias per cde non per uno \cd(si noti che non molte shell consentono alias con barre rovesciate), quindi scrivendo:

\cd dir

stai assicurando che il tuo cdalias non venga sostituito.

In breve, citando un nome di comando o di parte di esso impedisce di essere visto come parola chiave shell (parole chiave essendo cose come while, for, if, {... timeè una parola chiave in alcuni solo conchiglie), e ignora un alias si può avere per essa .

Non impone tuttavia che il comando si risolva in un file eseguibile $PATH, il comando viene comunque cercato prima tra le funzioni (che puoi aggirare facendo command time cmd...) e i builtin (che puoi aggirare facendo env time cmd..., anche se non so di una shell che ha un timecomando incorporato ).

Si noti che la citazione può anche influenzare il comportamento dei builtin speciali della famiglia typeset/ declare/ export/ local... in alcune shell. Vedi Le virgolette sono necessarie per l'assegnazione delle variabili locali? per dettagli.


Quindi, la differenza tra timee cdche porta alla differenza nel comportamento osservato è che timeè una parola chiave ed cdè un comando incorporato ?
Jonas Schäfer,

1
@JonasWielicki, timeè una parola chiave e cdnon lo è. (e se avessi un alias per cdo time, sarebbe un'altra cosa). Che cdsia incorporato o meno non ha incidenza a questo punto (per quanto riguarda l'influenza della quotazione). Alcune shell hanno tuttavia alcuni builtin che si trovano a metà strada tra parole chiave e builtin poiché l'analisi viene eseguita in modo diverso da altri builtin. Questo è il caso di export/ typeset/ declare. Probabilmente dovrei aggiungere qualche nota a riguardo in questa risposta.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.