`\ Time`,` t \ ime` ve `\ cd` aslında ne yapar? (kabuklarda ters eğik çizgilerle eğlence)


9

/usr/bin/timeKabuk (bash ve zsh) yerleşik arasındaki farklar tartışılırken time, biri \timealmak için kısayol olarak kullanabileceğini belirtti /usr/bin/time.

İlk önce hoş bir masum kısayol gibi görünüyordu, ama sonra bazı sorular geldi:

  • Neden t\imeçalışıyor?
  • ¹ \cddeğişmese de dizini neden değiştiriyor /usr/bin/cd?

Açıkçası, \fooeşdeğer değildir $(which foo). Soru şu:

\fooHem bash hem de zsh'de gözlemlenen davranış, herhangi bir şekilde bir kabuğun POSIX tanımı tarafından kapsanır mı ve eğer öyleyse, neden olduğu gibi davranır?


Dipnot 1: /usr/bin/cdbenim sistemimde,

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

Ayrıca bkz. Unix.stackexchange.com/questions/12762/… \ komutunun, komutun diğer adlarını yok saydığını söyleyen özel olarak belgelenmiş tcsh işlevselliği olduğunu unutmayın.
simpleuser

Yanıtlar:


14

t\imeveya \cd(veya "tim"eveya 'cd'veya ${-##*}timeveya ${-+time}ve alıntı ve bu düşünebildiğim açılımları sonunda kadar çözümlenebileceğini diğer her kombinasyon timeveya cdyazma için başka bir yol:), yani cdve time.

Ancak, bu sonuçta kabuk sözdizimi ayrıştırma ve yorumlamaya cdveya timedaha sonra çözülecektir . Özellikle, kabuk anahtar kelime tanıma ve takma ad değiştirme gerçekleştikten çok sonra gerçekleşir.

Bu nedenle, kabuk kendi dilinde anahtar kelimeler aradığında ti\me, timeshell anahtar sözcüğü olarak tanınmaz . Yani:

ti\me echo test

kabuk tarafından basit bir komut olarak değil, basit bir komut olarak kabul edilir time.

Daha sonra içerideki alıntı ti\meişlenir (burada ters eğik çizgi, myine de tırnak işareti gerektirmeyen karakteri alıntılar, alıntı karakteri kaldırılır, alırsınız time) ve bir time komut diğer komutlar gibi (yerleşikler listesinde) aranır. , işlevler ve yürütülebilir dosyalar $PATH. Büyük olasılıkla /bin/timeburada olacak )

Çünkü cd, cdkabuk dilinde bir anahtar kelime yoktur , sadece cdyerleşik bir komut (sizin için önceliklidir /usr/bin/cd). Ancak, cd(gibi alias cd=pushd) için bir takma ad tanımlarsanız , tekrar aynı. Takma ad ikamesi çok erken yapıldığından, alıntı kaldırılmadan önce, için bir takma adınız varsa cdve bunun için bir takma adınız yoksa \cd(çok fazla merminin içinde ters eğik çizgi olan takma adlara izin vermediğini unutmayın), o zaman yazarak:

\cd dir

cdtakma adınızın değiştirilmediğinden emin olursunuz .

Kısacası, bir komut adı veya onun herhangi bir bölümünü alıntı bir kabuk anahtar kelime olarak görülüyor önler (anahtar kelimeler şeyler gibi olmak while, for, if, {... timebir anahtar kelimedir bazı sadece kabukları) ve bunun için olabilecek bir takma ad atlar .

Ancak bu komutu çalıştırılabilir bir dosyaya çözümlemeye zorlamaz $PATH, komut hala ilk olarak işlevler (yaparak yaparak çalışabilirsiniz command time cmd...) ve builtins (yaparak yaparak çalışabilirsiniz env time cmd..., ancak bilmiyorum ) arasında aranır yerleşik timekomutu olan bir kabuk ).

Alıntı yapmanın, typeset/ declare/ export/ local... ailesinin özel yapılarının bazı kabuklardaki davranışları üzerinde de etkisi olabileceğini unutmayın . Bkz . Yerel değişken ataması için tırnak işareti gerekli mi? detaylar için.


Yani, aradaki fark timeve cdbu gözlenen davranış farkı hangi tabakalara yol açar timebir olan kelime ve cdbir olan yerleşik komutu ?
Jonas Schäfer

1
@JonasWielicki, bu timebir anahtar kelime ve cddeğil. ( cdveya için bir takma adınız varsa time, bu başka bir sorun olurdu). Bu cdyerleşik ya da değil bu noktada herhangi bir insidansı yoktur (alıntılamanın etkisi söz konusu olduğunda). Ancak bazı kabuklarda, ayrıştırma işlemleri diğer yerleşiklerden farklı olarak yapıldığından, anahtar kelimelerin ve yerleşiklerin arasında bulunan birkaç yerleşik vardır. export/ typeset/ Durumu budur declare. Bu cevaba muhtemelen bir not eklemeliyim.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.