Cd yapar. kullandın mı


102

İzlemekte olduğum derslerden biri cd ., hiçbir faydası olmadığını belirtti . OP tarafından Sembolik bağlantı özyinelemesinde gösterilen sorunu çoğaltmaya çalışırken - “sıfırlama” yapan şey nedir? Ayrıca cd ., OP ile açıklanan (artan $PWDdeğişken) aynı etkiyi gösteren, bununla karşılaştırılabilecek denedim cd -P.

Bu beni meraklandırıyor, birinin kullanmak isteyeceği herhangi bir durum var cd . mı?


20
Dizin değiştirilirken dizinde çeşitli denetimler yapan özel bir .zshrc var, örneğin çeklerden biri dizinleri taşırken eşleşen bir sanalenv'i otomatik olarak etkinleştirmek / devre dışı bırakmaktır. Bazen yeni bir kabuk veya başka bir şey başlatabilirim ve bu çekler kaçmaz ve genellikle cd .bu çekleri tetiklemek için kullanırım çünkü kısa ve basittir. Sanırım soruyu vanilyalı bir ortam için yapmayı düşündün.
Yalan Ryan

29
Üzerinde (bariz) etkisinin yanısıra $PWD, cd .aynı zamanda değişir $OLDPWDgeçerli dizine. Bunun neden yararlı olabileceği hakkında hiçbir fikrim yok, ancak bütünlük uğruna…
Andreas Wiese

5
İhtiyacım olduğunu sanmıyorum cd ., aşağıdaki cevapları görsem de, gelecekte gelebilirim, ancak daha sonra bu dizine geri dönmek pushd .istediğimde kullandım popd. örneğin yapan bir yapı komut dosyası çalıştırılırken configure, cd output...ve make, ve bitince ben orijinal dizinine geri dönmek istersiniz. Herkesin beklediği şeyden farklı olan kendi derleme kitabımın kopyasını saklamak yerine, sadece olarak çalıştırıyorum pushd .; ./BuildScriptName.sh; popdve bu da bana popdbazen değil , daha popdsonra bunun yerine özgürlüğü veriyor .
3D1T0R

5
Tabii ki '.' ve '..' cd komutunda gerçeklenmedi, bu yüzden kimse bu özelliği ortaya çıkarmak için yola çıkmadı, sadece gerçek bir amaç için hizmet etmeyen şeylerin bir birleşimi.
David S

1
@ruakh Hayır, harici programlar kabuk çalıştırma ortamını etkilememelidir. Çoğunlukla bazı yardımcı programların kabuk dışında var olmasını gerektiren ve harici komutların çıkış durumunu değerlendiren POSIX uyumluluğu içindir. /bin/cdBuradaki amacı hakkında bilgi alabilirsiniz. Unix.stackexchange.com/q/50058/85039
Sergiy Kolodyazhnyy

Yanıtlar:


158

Bence bu problemi altüst ediyor. cd .bir şeylerin olağan seyri sırasında manuel olarak çalıştırılabileceği bir şey olmayabilir, ancak kesinlikle programatik yürütmede ortaya çıkabilecek bir şeydir ( cdyolu, kullanıcı tarafından sağlanan bir dosyayı içeren dizine gidebileceğiniz herhangi bir durumu düşünün) ). Bu nedenle, belirli bir kullanımı olması gerekmez: olağan semantiğini yerine getirdiği sürece cd <some-path>faydalıdır.


12
Kabul, sözdizimi sadece iyi bir şekilde .belirtilen geçerli bir yol olarak kabul edilmelidir cd.
Sergiy Kolodyazhnyy

18
Aşağıdaki örneği ekleyebilirsiniz: Süre gibi olan döngüler IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d). Seyri boyunca ., komut yolu cd "$Dir"genişler , böylece komut yolu genişler cd .. Bu yüzden, komut dosyalarında, mükemmel bir şekilde kullanışlıdır.
rexkogitans

5
Örneğin, bir komut dosyası gerçekten çalışır cd ${path_to_directory}, ancak bir noktada dizinin geçerli dizin olduğu ortaya çıkar ve path_to_directory = .bu cd .durumda çalışmanız gerekir .
Demis

4
Başka bir deyişle, faydası, gereksiz yere ekstra kod ( ifçek ve elsecümle, herhangi bir özel muhafaza) yapmasıdır.
jpmc26

2
Bu nedenle, x + 0 veya x * 1'in faydalı olması anlamında kullanışlıdır - spesifik işlem kendi başına yararlı değildir, ancak 0 ve 1'i diğer değerlerle aynı şekilde ele alabileceğiniz anlamına gelir; özel bir durum.
user32929

127

Dizinin yolu, son komutun çalıştırılmasından bu yana değişmiş olabilir cd .ve bash ve ksh93 mermileri olmadan , soru ile bağlantılı mesajda açıklanan mantıksal çalışma dizinine bağlı kalacaktır , bu nedenle arama cd ., kabuk sorununu hangi sistemin getcwd()kontrol etmesini sağlayacaktır? geçerli yol hala geçerli.

Bash olarak çoğaltmak için adımlar:

  1. Bir terminal sekmesinde sayısında mkdir ./dir_no_1; cd ./dir_no_1
  2. Farklı bir terminal sekmesinde sayısında mv dir_no_1 dir_no_2
  3. İlk terminal sekmesinde sorun echo $PWDve pwd. Dizinin harici olarak yeniden adlandırıldığına dikkat edin; kabuğun ortamı güncellenmedi.
  4. Sayı cd .; pwd; echo $PWD. Değerin güncellendiğine dikkat edin.

Bununla birlikte, ksh93 çevre bilgilerini güncellemez, bu nedenle cd .ksh93'te aslında işe yaramaz olabilir. In /bin/dashUbuntu ve diğer Debian tabanlı sistemlerde, cd .döner dash: 3: cd: can't cd to .ancak hatayı cd -P .(ksh93 aksine) çalışır.


22
Bilinmesi Gerekenler: Bunu, gereksiz bilgiler listeme ekleyeceğim. ^^)
jayooin

12
@jayooin Listeye katkıda bulunabildiğime sevindim;)
Sergiy Kolodyazhnyy

8
Ne yapabilirim düşünüyorum mv ../dir_no_1 ../dir_no_2içinde aynı terminali / bash.
ctrl-alt-delor

3
@ ctrl-alt-delor Onaylandı, çalışıyor :)
Sergiy Kolodyazhnyy

1
@ymbirtt Çoğu kabukta, pwdaslında yerleşiktir, ancak çağrı yapmanın /bin/pwdkabuğun çevresi üzerinde hiçbir etkisi yoktur - genel olarak dış uygulamalar kabuğun çevresini etkilemez. Neden /bin/cdve /bin/pwdvar olmanın nedeni POSIX uygunluğu için diğer şeylerin yanı sıra. Bir var harici cd hakkında iyi bir tartışma muhtemelen uygulanır bazıları /bin/pwdyanı
Sergiy Kolodyazhnyy

55

Diğer bir kullanım durumu, içinde cd .bulunduğunuz dizinin silinmesi ve ardından tekrar yapılmasıdır. Aşağıdakileri denemeyi düşünün -

  1. Bir dizin oluştur temp
  2. cd temp ve sonra bir ls
  3. Başka bir terminal açın ve silin ve bu dizini yeniden oluşturun temp
  4. İlk terminalden döndüğümde, ls yapmayı dene. Bu bir hataya yol açar -ls: cannot open directory .: Stale file handle
  5. cd . ve sonra bir ls yapmak iyi çalışıyor

3
Bu her zaman işe yaramaz. Örneğin, kısa bir çizgi elde edersiniz: cd: can't cd to .Şimdi bakıyorum, bu Sergiy'in cevabında zaten belirtildi (taşıma, silme / yeniden oluşturma - aslında aynı: içinde bulunduğunuz dizin artık orijinal olanı değil) yol)
Olorin

12
Bunu uzaktan dağıtma testlerinde çok kullanıyorum. İçinde bulunduğum dizin silinir ve sonra bir miktar otomasyon tarafından yeniden oluşturulur cd .ve aynı dizindeki yeni dizine taşınmam için yayın yapmam gerekir .
HP Williams,

2
cd .Geçerli çalışma dizini sshfs ile birlikte bağlanmış ancak ssh oturumu kapatılıp yeniden açılmış bir kabuğum olduğunda her zaman kullanıyorum .
jamesdlin

4
Böyle bir durumda "cd $ PWD" yapıyorum. Diğer değişkenler işe yarayabilir, ancak bu açıkça bir niyeti ifade eder: şu anki yolum olanı çıkart (örneğin, PWDortam değişkeninin içeriğini oku ), ardından dosya sistemi hiyerarşisini kökten aşağıya, ulaşılabilir bir dizine doğru yürü Bu yol, aslında aynı dizin olsun ya da olmasın. Bu tam olarak bu cevaptaki kullanım durumuna uyuyor.
Stéphane Gourichon

3
cd .Dizinin bağlantısı kesildiğinde ve aynı dosya sistemi yolunda yeni, farklı bir dizin oluşturulduğunda işe yarayan , gerçekten şok oldum . Geçerli çalışma dizini bağlantısı kaldırıldı ve büyük olasılıkla bunun bir parçası olarak, artık bir .veya ..girişi yok ve giriş yapmış olsa bile .giriş kendine göstermeye devam etmeli. Kabuk veya çekirdek, basitçe .girişe erişmek yerine, dizin yolu adının ne olduğuna bağlı olarak cd komutunu çalıştırıyor gibi görünüyor . Birisi bu davranışı onaylayabilir mi?
Adrian Pronk

36

Herhangi bir yerde "ilginç" olarak işaret etmesini istemediğiniz bir durum olması durumunda, $OLDPWDçabucak temizleyebilirsiniz cd .. Aynı zamanda etkileyecektir cd -.


16

Programatik olarak no-op olarak kullanışlıdır. Harici girişten sağlanan bir yol düşünün.

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

Bir yol ile örneğin "fred.txt" olarak dizin haline gelecek .yol açancd .


1
Zaten navigasyon yaptığınız dizindeyseniz hata atmaması yararlı olur, ancak no-op olarak kullanılamaz olduğunu söyleyemem.
Kaptan Adam

2
@CaptainMan, zaten dizinde (etkin) no-op iseniz bir hata atmıyor. dirnameKomut üretir .gerektiğinde bir yol bölmek mümkün olmasını beklediğini kırılma kod önlemek için.
roaima

15

Kötü bir USB kablosuyla çalışmak zorundaysanız bu yaygındır. Bir aygıtın bağlantısı kesilip tekrar bağlandıktan ve aynı dizine otomatik olarak bağlandıktan sonra, cd .tekrar çalışmasını sağlamak için kullanmanız gerekir.


1
Bu ne tür bir cihaza, nasıl erişildiğine, dosya sistemine, işletim sistemine ve c'ye bağlı değil mi?
Ocak’ta

İşletim sistemi belki. Çekirdek kullanılırken çıkarmadan çıkma yolunu bulabildiği sürece, dosya sistemi alakalı değildir. Her durumda, komut tam olarak doğru durumda kullanıma sahiptir.
user23013

11

Bunu not et "." olduğu (tabii bir kabuk işlemi dahil) ve herhangi bir işlemin geçerli çalışma dizini olarak açık olan dosyanın adını belirtmek için uygun yolu "" geçerli çalışma dizini de dahil olmak üzere her klasördeki tüm dosyalarda geçerli bir addır. .Alttaki geçerli çalışma dizini kaldırılmışsa (veya eski bir NFS işleci gibi "kötü", örneğin eski bir NFS işleci giderse), ad, bir işlemin belirli bir örneği için geçerli bir ad olmayabilir. Her geçerli dizinde var olduğu garantili olan bir dosyanın.

Bu nedenle , bir dizinin adını kabul eden herhangi bir komut için geçerli bir argüman . olmalı ve bu nedenle standart kabukta cd .geçerli bir komut olmalıdır.

cd .Yararlı olup olmadığı kabuk uygulamasına bağlıdır. Bahsedildiği gibi, kabuğun, altta yatan chdirsistem çağrısını çağırdıktan sonra geçerli çalışma dizininin tam yol adı hakkındaki dahili fikrini sıfırlaması, örneğin, altta yatan dizinin (veya bunun bazı ebeveynlerinin) yeniden adlandırılmış olup olmadığını söylemesi yararlı olabilir.

(Biliyorum bazı kabukları az /bin/shdönüştürür FreeBSD ve NetBSD üzerine) cd ""içine cd .muhtemelen bir değişken, yani içine boş bir değişken ikame dönüştürülmesi (bir parametre olarak kullanılabilen bir kabuk içinde programlı kullanımı desteklemek için bir özellik tarif edilebilir, bir " "hiçbir şey yapmayın" sonucu), FreeBSD taahhüt geçmişi, değişikliğin doğrudan bir POSIX desteği eklenmesinden kaynaklandığını, bununla birlikte chdir("")POSIX yetkilerinin başarısız olması gerektiğini söyledi.

Diğer bazı mermiler, .geçerli çalışma dizinlerine tam yetkili yol adı olarak sakladıkları şeylerin yerini alacak ve bu nedenle onlar için Sahil Agarwal'ın cevabında belirtilen davranışa izin verilebilir .


4

Bugün bu komutu Git'te üzerinde çalıştığım dalı ilk kez aynı dalda oluşturulmuş bir dizinin içinden yeniden doğduğumda kullandım. Rebase iyi gitti ama daha sonra git statusbir hata attı. Her cd .şey normaldi sonra .

(Windows üzerinde MobaXterm'de çalışıyordum, bu arada. Bunu çoğaltmaya çalışıyorsanız, diğer sistemlerde olmayabilir.)


Ayrıca bu komutu eski dizini kenara alan ve onu yenisiyle değiştiren otomatik bir işlemle yenilenen dizinlerde de kullandım (bu yüzden olabildiğince atomuna yakın). Yaygın bir durum değil cd ., tam olarak ihtiyaç duyulan şey.


Stephane Chazelas'tan bu mükemmel cevabı okuduktan sonra:

Şimdi anlıyorum ki kullanım durumlarımın sadece işe yaradığını çünkü bashbunun cd .içinde eşdeğer olduğumu biliyorum cd "$PWD". Bağlantılı cevabı okumanı şiddetle tavsiye ederim.


1

cd .Aşırı yüklediğim eşyaları cdbir bashfonksiyonla tekrar çalıştırmak için kullanıyorum .

Benden ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

0

EDIT: Bu daha önce Sahil tarafından önerilmişti .

Bu, başka bir işlem tarafından silinmiş ve yeniden oluşturulan bir klasörün içindeyseniz kullanışlıdır. Örneğin, iki terminal oturumunu varsayarak $1ve $2:

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

Bu davranışın kök nedeninin tam olarak nerede (OS, SHELL, ...?) Olduğundan emin değilim.


Bu zaten diğer cevaplar tarafından dile getirilmiştir.
Kusalananda

-8

Hayır, hiçbir anlamı yok. Ne komut dosyasında, sadece hiçbir şey yapmaz.


2
Kabuğa bağlı olarak sıfırlanacak $PWDve kullanıcının cdyerleşik aşırı yüklenmek için kendi işlevini veya diğer adını sağlaması durumunda, diğer kabuk işlevlerini çağırabilir cd. Ayrıca, geçerli dizinin hala geçerli olduğunu ve mevcut kullanımın orada bulunma izninin olduğunu doğrular.
Kusalananda

1) elbette "cd" nin olası özel takma adlarından değil, standart yapıdan söz ediyoruz. 2) izniniz yoksa mevcut kullanım nasıl olabilir? Basitleştirmek için sadece gerçek dünyada bence kullanmak için hiçbir sebep olmadığını söylüyorum.
Federico,

1
1) değil mi? 2) Gerçek dünya basit değildir ve Unix çok kullanıcılı bir işletim sistemidir. Bir kullanıcı, dizinler üzerindeki izinleri değiştirebilir ve eğer komut dosyası veya başka bir kullanıcının etkileşimli kabuğu, çalışma dizini olarak bu dizinin (veya bir alt dizininin) cd .olması durumunda şikayetçi olur.
Kusalananda

4
Federico, sitenin kurallarına ve kendi kişisel kurallarım uyarınca, cevabınızı reddetmeliyim. Ancak, sen yenisin. Hoşgeldiniz! Lütfen diğer cevapların bazılarını gözden geçirin . Bundan sonra, cevabınızın yanlış olduğunu düşünüyorsanız, lütfen silin. Lütfen bu soruya ve diğer sorulara başka cevaplar vermekten zevk alın.
daveloyall

2
Özellikle senaryoda, bazen "hiçbir şey yapmaz" tam olarak ihtiyaç duyulan şeydir.
Matthew Najmon
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.