Yıldız imgesinin Unix'te bağımsız bir komut olarak işlevi nedir?


21

Red Hat Linux'ta terminalde uğraşıyordum ve yıldız işaretini yazarken * ) ardından return ve dizinimdeki programlardan birini yürüttü. Niye ya?

En iyi tahminim, Unix'in bir joker karakter olarak işlediği ve böylece ilk alfabetik programı yürüttüğü. Dan beri my_program.exe ve one_of_my_programs.program basitçe dosyanın adını yazarak çalıştırılabilir, joker karakter operatörü tüm olası dosyaları temsil eder. Bir program ilk önce alfabetik olarak yazıldığından, Unix programı çalıştırır. Bu doğru bir karar mı?


2
FYI eğer set -x sonra emrini yerine getir ( * ) herhangi bir değişiklikten sonra kabuğun gerçekte her komutla yürütmeye karar verdiğini göreceksiniz. (bu modu tekrar kapatınız) set +x )
drewbenn

Tüm kabukların genişlemesini sıralamadığını düşünüyorum. * alfabetik olarak, ancak bash olanıdır.
aschepler

1
@ aschepler: tüm POSIX uyumlu mermiler; görmek pubs.opengroup.org/onlinepubs/9699919799/utilities/... paragraf 3
dave_thompson_085

Yanıtlar:


21

Yorumun doğru. Dosyaların geri kalanı parametre listesi olarak sunulacaktır.

Bunu yalnızca programın çalıştırılabilir bit kümesi varsa ve geçerli dizinde PATH liste.

Anlamaya yardımcı olabilecek birkaç not: -

  • Yazarsanız ./* sonra PATH giriş bir gereklilik değildir.
  • Yazarsanız . * veya . ./* ve ilk eşleşen dosya bir komut dosyasıdır, o zaman çalıştırılabilir olması gerekmez, ne de geçerli dizinin içinde olması gerekmez PATH (dışındaki mermiler için doğru olmayabilir bash ).

10
“Bunu sadece yapacak…” - Daha ilginç olabilir. Daha önce içinde bir kabuk işlevi, yerleşik veya çalıştırılabilir bir işlev varsa PATH ilk dosya ile aynı isimde sonra bu diğer komut çalıştırılacaktır. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski

@KamilMaciorowski - Adil nokta: "benim sadece bunu yapacak ..." ifadem belirtildi gerekli şartlar ama değil yeterli olanlar. Komut ayrıca farklı davranır * bir takma addır.
AFH

1
Sonuç: bunu yapma! Glob genişlemesine alfabetik sıralamaya güvenebileceğinizi düşünüyorsanız bile, bu sıranın yerel ayarlara bağlı olduğunu unutmayın.
Aaron

ek olarak . * veya . ./* bir kutu bash * (veya başka bir kabuk).
Olivier Dulac

11

Bu şunu önerir . senin bir parçası PATH değişken. Bu güvenlik nedenlerinden dolayı gerçekten kötü bir fikir (doğal olarak, Windows bunu değiştirilemez bir varsayılan yapmak zorunda kaldı).

Ancak, bu "öneri" yalnızca hafif geçerlidir: adlı bir dosyanız varsa rm geçerli dizinde * yürütme iyi olacak varsayılan rm:

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Gördüğün gibi, değildi rm Yürütülen geçerli dizinde (boş ve çalıştırılamayan bir dosya) /bin/rm.

Joker karakterler söz konusu olduğunda komutlarınızı her zaman iki kez kontrol edin. İşte şimdiye kadar okunacak en korkunç mesajlardan biri:

rm: cannot remove '.o': No such file or directory

Bu arama sonucu

rm * .o

, en çok veya daha az, birinin bulabileceği sahte bir alanın en kötü yerleşimi.


1
Bir işlev oluşturmak için zarar vermez rm() ya ekler -i Parametrelere veya parametreleri kontrol eder ve belirli bir sayıdan fazla olup olmadığını onaylamanızı ister.
AFH

3
+1 "İşte şimdiye kadar okunacak en korkunç mesajlardan biri".
Mehrdad

+1, "Bu, güvenlik nedenlerinden dolayı gerçekten kötü bir fikir (doğal olarak, Windows bunu değiştirilemez bir varsayılan hale getirmek zorunda kaldı)."
Duncan X Simpson


Windows'un bunu değiştirilemez bir varsayılan haline getirmesinin iyi bir nedeni var. DOS'un dizinleri uygulamaya koymasından önceki günlerden geriye dönük bir uyumluluk zinciri sürdürmek zorundadır. O günlerde bilgisayar kullanan hiç kimsenin bir sabit diski olmadığını ve disketlerin ilk başta dizinlerin gerekli görülmediği kadar küçük olduğunu unutmayın.
Muzer
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.