Utworzyłem trzy pliki w moim katalogu za pomocą polecenia touch inv{1..3}.txt
. Teraz użyłem dwóch poleceń, a ich wynik jest prawie taki sam. Te dwa polecenia to ls inv[13].txt
i ls {1,3}.txt
.
Więc czym się różnią te dwa? Czym różnią się nawiasy kwadratowe od nawiasów klamrowych? Również googlowałem dla „linux [..]”, ale nic nie znalazłem, więc czy mogę wiedzieć, jak te rzeczy są nazywane w terminologii linux?
Dzięki
command-line
bash
scripts
posixKing
źródło
źródło
{}
i File Name Expansion> Pattern Matching dla[]
.Odpowiedzi:
{}
nazywa się rozszerzaniem nawiasów klamrowych. Ma dwie formy:{x..y}
a{x,y}
, wymienićx
iy
przy dowolnej wartości alfabetycznym lub numerycznym.W pierwszej formie
{x..y}
zostanie rozwinięty do wszystkich wartości odx
doy
włącznie. Na przykład,{2..5}
zostanie rozszerzona2
,3
,4
,5
.W drugim zrozumiałej formie,
{x,y}
zostanie rozszerzona wyłączniex
,y
. Na przykład{2,5}
zostanie rozwinięty do2
i5
.Jeśli nie jest możliwe rozwinięcie, wzór jest traktowany dosłownie np
{a..3}
. W.Ważną rzeczą do zapamiętania jest to, że rozwinięcie nawiasów zostanie wykonane (jeśli to możliwe) niezależnie od dopasowania pliku, podczas tworzenia / dopasowania pliku.
[]
jest znany jako wzorzec rozwinięcia (lub globowania) ścieżki. W przeciwieństwie do rozszerzenia nawiasów klamrowych możesz go używać tylko podczas dopasowywania nazw plików, będzie traktowany dosłownie, jeśli użyjesz go podczas tworzenia plików.Ma dwie formy:
[xyz...]
i[x-y]
.W pierwszej formie będzie pasował do każdego pojedynczego znaku w nawiasach kwadratowych oddzielnie, tzn. Każdy znak jest traktowany indywidualnie. Tak więc
[25].txt
będzie pasował do pliku o nazwie2.txt
lub5.txt
w bieżącym katalogu, podczas[245].txt
gdy będzie pasował do dowolnego pliku o nazwie2.txt
lub4.txt
lub5.txt
.W drugiej formie, rozszerzenie zakresu jest wykonywane najpierw przed dopasowaniem indywidualnie, jeśli to możliwe, traktowane dosłownie. Tak więc
[2-5]. txt
, dopasuje każdy plik o nazwie2.txt
lub3.txt
lub4.txt
lub5.txt
. Jeśli zakresu nie można rozszerzyć, będzie traktowany dosłownie np. W przypadku[a-3].txt
.Ważną różnicą behawioralną między tymi dwoma jest to, że istnieje więcej pasujących wzorów, a mniej faktycznie jest dopasowywanych. Ponieważ interpretacja nawiasów jest wykonywana bez względu na wszystko, pokaże błąd, że niektóre pliki nie istnieją, podczas gdy rozwinięcie nazwy ścieżki będzie pasować, bez względu na możliwy błąd, dla pozostałych:
Uwaga dotycząca przenoszenia:
[]
Operatora rozszerzenie ścieżka jest wyznaczona przez POSIX stąd między przenośnym Bourne powłoki i pochodne.Rozszerzenie nawiasów,
{}
nie jest zdefiniowane przez POSIX, dlatego nie jest przenośne wśród wszystkich powłok. Na przykładdash
(sh
w Ubuntu) tego nie ma. Został wypożyczony zcsh
i będzie działać tylko na niektórych muszli npbash
,zsh
,ksh93
,fish
. Upewnij się, że używana powłoka obsługuje to przed wdrożeniem.Przykład:
źródło
[
]
ekspansji, gdy nie ma żadnych dopasowań, ponieważ mogą się one różnić w zależności od konfiguracji powłoki. Jeśli chcesz użyć[
lub]
w nazwie pliku, należy go podać w poleceniach. Warto również zauważyć różnicę między{13..79}
i[13-79]
. Pierwszy będzie produkować wszystkie liczby w zakresie od13
do79
, drugi będzie pasował znaki1
,3
,4
,5
,6
,7
, i9
.nullglob
(lub podobnie). Jeśli chodzi o[13-79]
dopasowanie, myślę, że wyraźnie wspomniałem w mojej odpowiedzi na temat zachowania poszczególnych postaci [] `.ksh
ma tę funkcję, ale nie jest to bardziej nowoczesne smaki, takie jak mksh i pkdshKluczową różnicę między tymi dwiema formami zilustrowano tutaj:
inv[15].txt
jest globem i rozszerzy listę pasujących plików w systemie plików. To jest rozszerzenie nazwy ścieżki .inv{1,5}.txt
rozwija sięinv1.txt
iinv5.txt
niezależnie od tego, jakie pliki faktycznie znajdują się w twoim systemie plików. To jest nawias klamrowy .źródło
ba{con,tman}
i nie ma odpowiednika za pomocą nawiasów kwadratowych. IOW, rozwijanie nawiasów klamrowych nie dotyczy tylko pojedynczych znaków.