Czy globbing jest cechą powłoki?

12

Czytam wiele pytań i odpowiedzi takich jak ta i ta

Wiem, że symbole wieloznaczne są rozszerzane przez powłokę przed uruchomieniem polecenia i są one cechą powłoki. Również symbole wieloznaczne działają z tymi poleceniami, które mogą przyjmować wiele argumentów. W find . -name *.rb jeśli mamy więcej niż jeden plik w katalogu bieżącym findda nam błąd, ponieważ tu nie może przyjąć wiele argumentów i sposobów rozwiązania tego są:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Uciekamy z gwiazdki i zapobiegamy rozszerzaniu przez powłokę, ale symbole wieloznaczne są cechą powłoki; kiedy uciekamy, powłoka gwiazdki nie wie o jej znaczeniu i powinna znaleźć plik o nazwie *.rb, więc w jaki sposób w tym przypadku rozszerzana jest gwiazdka?

Sinoosh
źródło

Odpowiedzi:

21

Tak, powłoka rozumie *jako wszystkie pliki z dowolnymi znakami w katalogu oraz *.rbjako wszystkie pliki z dowolnymi znakami i zakończeniem .rbi jako takie rozwija.

Samo findpolecenie akceptuje globowanie.

Jeśli nie cytujemy *następnie powłoka będzie go rozwinąć przedfind polecenie widzi swój argument, więc zamiast glob *.rbprzekazany do findnazwy wszystkich plików pasujących do glob w katalogu zostaną przekazane find, i findpostara się je interpretować jako argumenty, które prawdopodobnie spowodują błąd, a przynajmniej nie to, czego chcesz (zadziała poprawnie tylko wtedy, gdy w bieżącym katalogu nie ma pasujących plików)

Zanna
źródło
dziękuję, to znaczy, że mówimy, że nie jest to glob, ale niektóre polecenia mogą rozszerzać symbole wieloznaczne? czy możemy powiedzieć, że jeśli mamy powłokę bez wiedzy na temat globowania, te polecenia wiedzą, że globbing może je rozwinąć?
Sinoosh,
5
jeśli *jest cytowany, to powłoka go nie rozwija, a argument zawierający glob jest przekazywany do polecenia, które może zrozumieć glob - to samo dla wszystkich poleceń, które akceptują wyrażenie regularne, które zawsze powinno być cytowane ...
Zanna
1
Cała przyjemność po mojej stronie ^ _ ^
Zanna,
7
@Sinoosh: Zauważ, że nie wszystkie polecenia rozumieją składnię globalną. Tak się składa, żefind
Slebetman
1
@Sinoosh Find tak naprawdę nie „rozszerza” symbolu wieloznacznego, używa go jako testu dopasowania każdej napotkanej nazwy pliku. Istnieje (bardzo) kilka poleceń, które rozszerzają symbole wieloznaczne w tradycyjnym znaczeniu - na przykład rozpakuj i 7z mogą go używać do otwierania wielu archiwów (gdy ich argumenty zwykle mają postać „ [archive filename single argument] [list of files to extract]”).
Random832