Co oznacza znak zapytania w poleceniu terminalu?

Odpowiedzi:

15

Są to tak zwane symbole wieloznaczne (wzorce globowania)

Standardowe symbole wieloznaczne (znane również jako wzorce globowania) są używane przez różne narzędzia wiersza polecenia do pracy z wieloma plikami.
Standardowe symbole wieloznaczne są używane przez prawie każde polecenie (w tym mv, cp, rm i wiele innych).

  • (question mark)

    może to reprezentować dowolny pojedynczy znak. Jeśli podałeś coś w wierszu polecenia, np. „Hd?” GNU / Linux szukałby hda, hdb, hdc i każdej innej litery / cyfry od az, 0-9.

  • *(asterisk)

    może to oznaczać dowolną liczbę znaków (w tym zero, innymi słowy zero lub więcej znaków). Jeśli podasz „cd *”, użyje „cda”, „cdrom”, „cdrecord” i wszystkiego, co zaczyna się od „cd”, również samego „cd”. „m * l” może przez młyn, mull, ml i cokolwiek, co zaczyna się na m, a kończy na l.

  • [ ] (square brackets)

    określa zakres. Jeśli zrobiłeś m [a, o, u] m, może to być: mama, mama, mama, jeśli zrobiłeś: m [ad] m może stać się czymkolwiek, co zaczyna się i kończy na m oraz ma między sobą dowolną postać od a do d. Na przykład działałyby: mam, mbm, mcm, mdm. Ten rodzaj symbolu wieloznacznego określa relację „lub” (wystarczy tylko jedna, aby dopasować).

  • { } (curly brackets)

    warunki są oddzielone przecinkami, a każdy termin musi być nazwą czegoś lub symbolem wieloznacznym. Ten symbol wieloznaczny skopiuje wszystko, co pasuje albo do symboli wieloznacznych, albo do dokładnych nazw (relacji „lub”, jednej lub drugiej).


Na przykład byłoby to prawidłowe:

  • cp { .doc, .pdf} ~

    Spowoduje to skopiowanie wszystkiego, co kończy się na .doc lub .pdf, do katalogu domowego użytkowników. Pamiętaj, że spacje nie są dozwolone po przecinkach (ani nigdzie indziej).

  • [!]

    Konstrukcja ta jest podobna do konstrukcji [], z wyjątkiem tego, że zamiast dopasowywać dowolne znaki w nawiasach, będzie pasować do dowolnego znaku, o ile nie będzie wymieniony między [i]. To logiczne NIE. Na przykład rm mój_plik [! 9] usunie wszystkie moje pliki * (tj. Mój_plik1, mój_plik2 itp.), Ale nie usunie pliku o numerze 9 w dowolnym miejscu w jego nazwie.

  • \ (backslash)

    jest używany jako znak „ucieczki”, tj. do ochrony kolejnego znaku specjalnego. Dlatego „\” wyszukuje ukośnik odwrotny. Uwaga: może być konieczne użycie cudzysłowów i ukośników.

więcej przykładów: odwiedź tę stronę

zarejestrowany użytkownik
źródło
3
Warto wspomnieć, że apt-get removewymaga to nazw pakietów , a nie nazw plików, co sprawia, że ​​rozszerzanie symboli wieloznacznych przez powłokę jest w dużej mierze bezużyteczne. Jeśli chcesz usunąć zakres pakietów, musisz użyć pełnego wyrażenia regularnego, odpowiednio cytowanego, aby zapobiec próbom interpretacji powłoki jako glob (np apt-get remove 'gnome.*'.).
4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=> FAŁSZ. te symbole wieloznaczne są rozwijane przez powłokę, a to, co otrzymuje polecenie, jest wynikiem rozszerzenia (tzn. plików pasujących do wzorca) zamiast wzorca. (jeśli nie ma pliku pasującego do wzorca, wzór ten zostanie jednak przekazany bezpośrednio do polecenia)
Carlos Campderrós
17

Ogólnie rzecz biorąc, w Bash, a ?jest globalnym wzorcem, który rozwija się do dowolnego charakteru.

Na przykład:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2

Jest podobny do *, ale *rozwija się do 0 lub więcej znaków, podczas gdy ?rozwija się do dokładnie jednego (dowolnego) znaku.

Jednak w twoim szczególnym przypadku ?polecenie wydawało się literówką.

Malte Skoruppa
źródło
Więc to jest bezużyteczne / niepotrzebne w moim przypadku, prawda?
Ooker
Tak. W rzeczywistości został on zredagowany na podstawie odpowiedzi, do której podałeś link, kiedy zadałeś pytanie. :)
Malte Skoruppa
1
Nie mogę w to uwierzyć: -o
Ooker
1
Nawet jeśli były to poprawne symbole wieloznaczne, należy unikać tego użycia bez cytowania. apt-get rozumie RE, ale jeśli gnome1w bieżącym katalogu istnieje plik o nazwie , powłoka go rozwinie, zanim apt-get będzie mógł go zobaczyć.
Rmano
@Ooker Nigdy tego nie zapomnisz!
kolega towarzyski