* 'İ 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*
* 'İ 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*
Yanıtlar:
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:
Daha sonra mv *
garip görünen bir şey yazarsanız : test3
orada, 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 test3
mv 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*
mv
temp 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.*
yerine "zayıf" bir şey yok ls
. Örneğin, for f in *; do
bir daha fazla güvenilir for f in $(ls)
bir dosya adı boşluk veya bir topak karakteri içeriyorsa. (Bununla birlikte,
shopt nullglob
için.
echo *
, bu hile bazı durumlarda sizi kurtarabilir .
Daha önce belirtildiği gibi, kabuk genişler, *
bu nedenle echo
kabuk 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 \*
.
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.
rm
Elbette adlı bir dosya olabileceğini unutmayın .
-rf
? Denedim touch -rf
ve touch \-rf
ama bunu yaratmak değildir.
-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)
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