“Dosya” ve “./file” yolları arasında herhangi bir fark var mı?


Yanıtlar:


14

SmallLoanOf1M'nin açıklaması hakkında deli değilim. Teknik olarak doğrudur, ancak sorudaki kullanım örneğiyle eşleşmeyecek şekilde yanıt verir.

Örnek olarak, şu iki soru arasında önemli bir fark var: "dosya" ve "./file"

Dosya kabuk tarafından ayrıştırılan bir karakterle adlandırılırsa ne olur? Özellikle çalışan komutla yorumlanan karakterlerle ilgili.

Özellikle, "tire" karakteri: "-". Ancak diğer karakterler kabuk için anlamlıdır.

Misal. Dosyama "-dingle" adı verildi

Dosyayı listelemeye çalışın:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

Daha da kötüsü, dosya " -rf rmbomb *" olarak adlandırılmışsa ne olur ? Şimdi kaldırmayı deneyin

rm "-rf rmbomb *"

Bu örneği çalıştırmaya bile çalışmayacağım, ama umarım bu fikri anlarsınız.

Öyleyse tire ile bakan bir dosyayı nasıl listeliyorsunuz? ./Önde kullanın .

# ls ./-dingle
./-dingle

Aynen rm


Bu, garip adlara sahip bazı dosyaları işlemek için geçerli bir yoldur ve cevabım böyle dosyaları dikkate almamıştır. Yukarıdaki örneklerin hepsinde bunun yerine, yukarıda belirtilen boşluklar da dahil olmak üzere tek karakterlerden önce ters eğik çizgi şeklinde bir değişmez bilgi kullanılabilir. Bunun bir örneği şöyle olabilir: ls \-dingleveya ls \-rf\ rmbomb\ \*. Bu, herhangi bir komut kümesinin en azından tutarlı olmasını sağlamak için iyi bir yol olabilir, çünkü ./bir adın ./.
Biriktirici

2
Kaçışlar komut tarafından değil, kabuk tarafından kaçtığından ve params komut tarafından ayrıştırıldığından, - kaçarak veya alıntı yaparak faydalı bir şey yapmaz.
Dewi Morgan

2
rm "-rf rmbomb *"Sadece rmbir hata yapmak yerine, kötü bir şey yapar gibi geliyor . Yalnızca dosya adını belirtmeyi unutursanız tehlikelidir, bu nedenle kelime bölme gerçekleşir. (özellikle rm $filebunun yerine çalıştırdığınız bir kabuk komut dosyasında rm "$file". Ancak bu durumda *genişlemeyecektir, çünkü değişken genişlemenin içeriğinde glob genişlemesi gerçekleşmez. İsterseniz, bir gerekir eval.) Her neyse, betiğiniz word-rm'e geçmeden önce dosya adlarını bölerse, adlı bir dosya space -rf .veya başka bir şey yaparım , bu yüzden rm ./$iyardımcı olmaz.
Peter Cordes

1
BTW, asıl hata mesajı, aynı argümanın bir parçası olduğu rm: invalid option -- ' 'için alanı -rftek karakterli bir anahtar olarak yorumlamaya çalıştığı andan itibaren . (Ve evet, bir şeyi gözden kaçırmış olsaydım boş bir dizinin içinde çalıştırdım ve aslında tehlikeliydi: P)
Peter Cordes

2
@PeterCordes: kelimeler bölme ve globbing, sırasıyla IFS=''ve tarafından bastırılmadığı sürece, -fsıralanmamış değişken genişletme ve komut ikamesi sonuçlarında YAPILIR . Daha nadir bir örnek, awkbir işleneni (komut dosyası olan ilk işlenenden başka) formun foo=baryürütülecek bir atama olarak, ancak ./foo=barokunacak bir dosya olarak ele almasıdır.
dave_thompson_085

7

Evet.

Düzenlenmek suretiyle filekomut satırında, BASH bu isimde bir dosya için sizin $ PATH ortam değişkeni arayacaktır. Dosya $ PATH değişkeniniz içindeki bir dizinde bulunmadıkça, dosya bulunmaz.

.geçerli dizin anlamına gelir. içindeki./ anlamına gelir nisbi anlamda geçerli dizinde. /home/sheogorath/shivering/isles.imgDizinde ./isles.imgçalışırken çağrılırken olduğu gibi bir şey söylemenin karşılığıdır /home/sheogorath/shivering/.

Bu nedenle, çalışma dizininizdeki dosyaları "yerinde" yürütmek için yaygın olarak kullanılır.

EDIT: Örneğin, lskabuk tarafından çağrılıyor ve path değişkeni kullanılarak bulundu. Argümanı, ne olursa olsun, çalışma dizininizde işlenecektir. Bunun için varsayılan olduğu için ls, belirtme arasında herhangi bir fark görmezsiniz.file./file her ikisi de geçerli dizininizi gösterdiğinden, ve açıkça belirtmek .

Tüm komutlar, çalışma dizinindeki dosya yollarını kabul etmez ve bazıları yapılandırma yoluyla önceden tanımladıkları bir dizindeki dosyaları belirtmenizi bekler. Dosyaları bağımsız değişken olarak kabul eden komutlar arasında, bu komutlar daha az yaygındır


1
Bu bash, ama genel olarak yol çözünürlüğünü merak ediyordum
Sergey Alaev

1
Bu, şimdiye kadar işlediğim herhangi bir kabuğun işleyiş şekli. BASH sadece en yaygın kullanılanıdır.
Biriktirici

4
$ PATH yalnızca komutlarla ilgilidir ve lsorijinal soruda belirtildiği gibi bir komutu izleyen dosya adı bağımsız değişkenleriyle ilgisi yoktur . Bu, göreceli bir yolu (geçerli çalışma dizinine göre) yeniden ifade ../../dir/filenameetme ile mutlak bir yol arasındaki /path/to/dir/filename
farktır

1
Sheogorath için +1 ... ve doğru cevap.
Corey Ogburn

1
Varsayılan olarak çalışma dizinindeki dosyaları bulmaya çalışan bir komutun argümanlarıysa, bunlar aynı olacaktır. Böylece, lsher zaman aynı yol olacaklardır, biri diğerinden daha açık bir şekilde belirtilmiştir. Bağımsız değişkenleri işlerken tüm komutlar bu şekilde davranmaz, ancak çoğu komut iş görür.
Biriktirici
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.