Echo * içindeki yıldız * ile ilgilenen


15

* 'İ kim (fırsatlar)

echo *

Yankı, yıldızı veya kabuğun onunla ilgilenip bir dosya adı listesi döndürdüğünü görür mü?

Ne dersin

cp temp temp*

14
Değişir. Unix kabukları mı yoksa Windows kabukları mı?
user1686

@grawity Unix kabukları. Üzgünüm bundan bahsetmedim.
faressoft

Unix için aşağıdaki cevaplar doğrudur. (Windows'da, ayrı programlar tarafından yapılır - genellikle
main'den

Yanıtlar:


24

bash (veya her ne kabuk olarak kullanmak), herhangi girdi okuyan ilk şey, ve gibi özel karakterleri yorumlama başlayacak ?ve *. CWD'de* eşleşen her şeye genişletilir , yani yıldız işareti bahsedilen eşleşmelerle değiştirilir.

Çoğu durumda, bu oldukça ileri doğrudur, ancak zaman zaman bazı kafa karıştırıcı vakalara yol açabilir.

Aşağıdakileri göz önünde bulundur. Bir dizin şu içeriğe sahiptir:

  • test (normal dosya)
  • test1 (dizin)
  • test2 (dizin)
  • test3 (dizin)

Daha sonra mv *garip görünen bir şey yazarsanız : test3orada, ama gerisi gitti. İlk başta garip olsa da, bash'ın gerçekten neye geçtiğini anladıktan sonra mantıklı mv. Çünkü asterisk, bash, yorumlanması mv *olarak mv test test1 test2 test3mv o listeyi aldığında ve bu son tartışma yaşanan tüm dosyaları taşınmış olurdu nerede hedef olduğunu varsayıyoruz.

Listelediğiniz komutlara gelince:

  • echo *bir fakir adamın işlevi görebilir ls. Kabuk, yıldızları bu dizinde ne varsa genişletecek ve zaten bildiğiniz gibi echo, kelimenin tam anlamıyla bash'ın kendisine argümanlar olarak geçirdiği her şeyi yankılayacak.
  • cp temp temp*mvtemp adında yalnızca bir dizin olmadığı sürece yukarıda açıkladığım komut gibi davranır , bu durumda kaynak ve hedef adı aynı değildir, yani hiçbir şey yapmaz.

8
Kullanmak *yerine "zayıf" bir şey yok ls. Örneğin, for f in *; dobir daha fazla güvenilir for f in $(ls)bir dosya adı boşluk veya bir topak karakteri içeriyorsa. (Bununla birlikte,
CWD'de

1
@rici Bunun shopt nullglobiçin.
CVn

3
Gelince echo *, bu hile bazı durumlarda sizi kurtarabilir .
CVn

2
Şununla gönderme: istenmeyen anahtarları tetikleyen rastgele klasörlerde "-" ile başlayan dosyalar. Eğer rm ./-stupidfile çalıştığını anlayana kadar onları kaldırmak çok eğlenceli değil.
ɯͽbρɯͽ

1
@ ɯͽbρɯͽ Bir zamanlar bir koordinat sistemindeki konumları temsil eden dosya adı içeren dosyaları içeren bir dizinin içeriğini -1024x-1024'ten 1024x1024'e silmem gerektiğinde fark ettim. İşte o zaman kaçmayı öğrendim.
Jarmund

5

Daha önce belirtildiği gibi, kabuk genişler, *bu nedenle echokabuk geçerli dizinde ne bulursa bulun, bağımsız değişken olarak alın. Ancak, genişletme hiçbir şeye yol açmazsa, yani dizin gizli olmayan dosyalar içermiyorsa, *değişmeden bırakılır ve adı verilen komuta olduğu gibi geçirilir (standart dışı seçenekler gibi bazı kabuklarla kullanılmadığı sürece bash). echo *o zaman fakir bir adamınki gibi davranmayacak ls, çünkü ikincisi hiçbir şey basmayacak, ikincisi ise basacak *.

Benzer şekilde, adın başladığı en az bir dosya yoksa, geçerli dizinde cp /tmp/temp temp*adlı temp*bir dosya oluşturur temp.

Son olarak, *ne olursa olsun değişmeden geçirilmesini istiyorsanız, tek tırnak '*', çift tırnak "*"veya ters eğik çizgi kullanarak genişletmeden koruyabilirsiniz \*.


4

Bash'te kabuk onunla ilgilenir. Eğer *yankı olmadan denerseniz ,

Not- bazı yorumlara dayanarak, * ENTER çalıştırırken, bir dizin oluşturmak ve bazı dosyaları yapmak için touch komutunu kullanmak ve hiçbirinin olmadığından emin olmak ya da en azından birincisinin alfabetik olarak ad olmadığından emin olmak için öneririm yoldaki herhangi bir komut dosyasının veya komutun.

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

Yani ls *bir klişe biraz

Windows'da, *komut tarafından işlenir, bu nedenle dir *.*klişe değildir.

Not- Bazı yorumları görmek, eklemek istiyorum, * sonra ENTER çalışan bir risk var. Dizin listesinde ilk sırada rm adında bir dosyanız varsa, o zaman tehlikelidir çünkü ondan sonraki her şey silinir. Ayrıca, dizin listesindeki ilk dosya yoldaki bir komut dosyasının adı ise, bu daha az olasıdır, o zaman bunu çalıştırır.


4
rmElbette adlı bir dosya olabileceğini unutmayın .
Volker Siegel

1
... ve
-rf

1
@ ǝɲǝɲbρɯͽ dosya adı olan bir dosyanız olabilir mi -rf? Denedim touch -rfve touch \-rfama bunu yaratmak değildir.
barlop

@barlop Yukarıda yorum yaptım; gui (gedit gibi) onları iyi idare eder, ancak kabuk (en azından bash) bunu içinden geçirdiği için ./ önde gerektirir. Hiç yanlışlıkla böyle bir dosya oluşturursanız, rm ipucu vermeye çalışır, ancak değilse: Umarım bu sadece tek kullanımlık çocuklarla geçici bir klasörde sona erer.
ɯͽbρɯͽ

@ Hepinizin de demek istediğini anlamıyorum ǝɲǝɲbρɯͽ, sana adlı bir dosya oluşturmak nasıl soruyorum -rf? (Rm adlı bir dosyanın ve -rf adlı bir dosyanın tehlikesini ve * yazma ve önemli bir klasöre girme sorununu anlıyorum, bunu yapmayı planlamıyorum)
barlop

-1

Kabuk , bağımsız değişkenler komuta teslim edilmeden önce birkaç genişletme gerçekleştirir .

Ayrıca bkz. Https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion

Bash'e özgü değil, bkz. Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01


Teknik olarak yazdığınız şey doğrudur, ancak bağlantılar olmadan bu cevap soruyu cevaplamak için gerçekten hiçbir şey yapmaz. İlgili ayrıntıları dahil etmeyi düşünün.
CVn

@ MichaelKjörling Bağlantılarla ilgili şeye katılıyorum, ancak OP sadece kabuğun veya komutun argümanları ele alıp almadığını sordu. Glenn'in cevabı, kabuğun onları ele aldığını belirtir, bu yüzden soruya kabul edilebilir bir cevaptır.
slhck

@slhck Bu yüzden NAA olarak işaretlemedim: Bağlantıları çıkardıktan sonra soruyu ele alan bir şey kaldı. Bu benim görüşüme göre iyi bir cevap olduğu anlamına gelmez . (Şimdi ilk yorumumun başka türlü yorumlanabileceğini görüyorum; bunun için özür dilerim, ama yine de olduğu yerde bırakmak için yeterli değere sahip olduğunu düşünüyorum.)
CVn

@ MichaelKjörling Kabul etti. Ben sadece NAA olarak işaret (ve olacak) için yorum yaptı .
slhck
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.