Başlığın dediği gibi * NIX dosya sistemleri için herhangi bir fark var mı? örneğin ls file
vels ./file
Başlığın dediği gibi * NIX dosya sistemleri için herhangi bir fark var mı? örneğin ls file
vels ./file
Yanıtlar:
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
ls \-dingle
veya 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 ./
.
rm "-rf rmbomb *"
Sadece rm
bir 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 $file
bunun 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 ./$i
yardımcı olmaz.
rm: invalid option -- ' '
için alanı -rf
tek 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)
IFS=''
ve tarafından bastırılmadığı sürece, -f
sıralanmamış değişken genişletme ve komut ikamesi sonuçlarında YAPILIR . Daha nadir bir örnek, awk
bir işleneni (komut dosyası olan ilk işlenenden başka) formun foo=bar
yürütülecek bir atama olarak, ancak ./foo=bar
okunacak bir dosya olarak ele almasıdır.
Evet.
Düzenlenmek suretiyle file
komut 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.img
Dizinde ./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, ls
kabuk 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
ls
orijinal 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/filename
etme ile mutlak bir yol arasındaki /path/to/dir/filename
ls
her 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.