`Dış` cd` komutunun amacı nedir?


71

Başvurulan gibi bu güzel cevap , POSIX sistemleri harici ikili sahip cdkabuk yerleşiğine ek olarak. OS X 10.8'de öyle /usr/bin/cd. cdKendi çalışma dizinini değiştirdikten hemen sonra çıktığından , yerleşik gibi kullanamazsınız . Hangi amaca hizmet ediyor?


Ubuntu ve CentOS’un (ve dolayısıyla muhtemelen Red Hat’ın) olmadığını /usr/bin/cd, yalnızca kabuğun yerleşik olduğunu unutmayın.
Keith Thompson,

1
/bin/cdBununla birlikte , Fedora 19 da içeriyor .
slm

1
Debian (mevcut testler /bin/cdde dahil olmak üzere çeşitli sürümleri kontrol ettim) ne de yoktu /usr/bin/cd.
derobert

1
Sanırım bu sistemler kesinlikle POSIX değil. Herkes gibi. :)
kojiro

Yanıtlar:


64

Öncelikle POSIX takım göğsünün bir kabuğun içinde ve dışında bulunmasını sağlamak olarak hizmet eder (bunlara ihtiyaç duymak için POSIX gerekçesine bakınız ).

Çünkü cdbu çok kullanışlı değil, cdancak dizinleri değiştirdiğini ancak başka yan etkileri olduğunu unutmayın: bu dizine girip giremeyeceğinizi belirlemeye yardımcı olan bir çıkış durumu döndürür chdir()ve neden yapamayacağınızı açıklayan yararlı bir hata mesajı verir. chdir()Yapamadığın zaman.

Örnek:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Diğer bir olası yan etki, dizinin otomatik sayılmasıdır.

Birkaç sistemde, standart kabuk yerleşiklerine ilişkin dış komutların çoğu, aşağıdakileri içeren komut dosyasına bir bağlantı olarak uygulanır:

#! /bin/sh -
"${0##*/}" "$@"

Bu bir kabuk başlatmak ve içindeki yerleşik çalıştırın.

Diğer bazı sistemler (GNU gibi), davranış kabuk yerleşik versiyonundan farklı olduğunda kafa karışıklıklarına yol açabilecek gerçek yürütülebilir komutlar gibi araçlara sahiptir.


2
Yan etkiler ve hata mesajları ile ilgili gözlem için +1. Yeni kullanıcılara Unix’teki birçok akıllı deyimin yan etkilerin dikkatlice kullanılmasından kaynaklandığı her zaman iyi bir şekilde açıklanmamaktadır. Man sayfalarının kendisi daha büyük resmi tarif etmede hiçbir zaman iyi olmadı.
RBerteig

SO'da benzer bir sorudan buraya geldim, “bir dizinin otomatik olarak sıralanması” derken ne demek istediğinizi ayrıntılandırabilir misiniz?
ffledgling


1
Stéphane Chazelas'ın düşüncesini biraz açmak için: üzerinde otomatik bir dizinin aslında herhangi bir değişiklik yapmadan ve herhangi bir dosyayı okumaya teşebbüs etmeden monte edildiğinden emin olmanız gerekiyorsa, harici cdkomutu kullanabilirsiniz . Bir taşınabilir uzaktan dosya sisteminin kullanılabilirliğini izlemede veya belki de bir tanesi ile zaman açısından kritik bir şey yapmadan önce faydalı olabilir.
telcoM

11

Olmayan bir yerleşik cd komutu kullanılabilir gerçeği POSIX üzerine inşa edilmiştir gereksinimi tüm düzenli yerleşikleri exec aile komutları tarafından çağrılabilir olabilmesi için env, find, nice, nohup, timeve xargsbu komutların bazıları kendileri yerleşikleri olarak uygulanıyor değildir gerçeğine birleştirdi.

Bu cdkomutları birleştirmek oldukça anlamsız olsa da, bu pek mantıklı gelmiyor . İşte buna rağmen, az çok aşılabilir örnekler:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
Bazı yerleşikler aslında bu kuraldan muaftır . Tuhaf bir şekilde, cd onlardan biri değil.
Kevin

5
@Kevin Ben yazdım ki tüm normal yapıların bir zorunluluk olduğunu , muaf tutulanların özel yapıların olduğunu : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetdış komutlar ile alakasız olacağını cd, komut olarak bazı belgelenmiş kullanım durumlarına sahip olan normal bir yapı olduğunu belirtirdim.
jlliagre

1

Bir yolun erişilebilir bir dizine karşılık gelip gelmediğini kontrol etmenin yanı sıra, cdçalıştırıcı CDPATHdeğişkeni işler ve kullanır ve başarıyla kullanılırsa çözülmüş dizinin mutlak yolunu yazdırır .

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Bu, yalnızca çok zaman zaman kullanışlıdır, ancak eşleşen dizinleri aramak için aynı mantığı tekrar uygulamaktan tasarruf sağlar. Somut bir kullanım durumu, belirli bir adın mevcut ilk dizinini birkaç olası ebeveyn altında bulmaktır.

cdAyrıca işler OLDPWDiçin cd -, ama ortam değişkeni zaten mevcut olacağından daha az somut yararlıdır.

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.