Czy istnieje różnica między sekwencjami {1,2,3}
a {1..3}
?
Na przykład, jeśli mam jakieś pliki
file.1
file.2
file.3
i chcę cat
je razem Czy korzystanie z niego jest bezpieczne cat file.{1..3} > file
?
Wiem, że cat file.*>file
może to powodować problemy, ponieważ powłoka może czasami losowo rozszerzać pliki (myślę, że to zależy od i-węzłów, prawda?)
cat file.[123] >file
file.*
nie zależy od i-węzłów. Zawsze sortuje je leksykograficznie, co może zależeć od ustawień lokalizacji.file.{1..3}
który rozszerza się na wszystkie trzy, niezależnie od tego, czy istnieją.cat
błędyfile.[123] not found
lub coś bardzo przydatnego.Odpowiedzi:
{1..3}
i{1,2,3}
dają ten sam wynik, ale w inny sposób.Ogólnie rzecz biorąc,
{n1..n2}
(który był pierwszyzsh
,bash
aksh
później skopiowany), gdzien1
in2
są liczbami całkowitymi, tworzą wszystkie liczby międzyn1
in2
. Choć{x,y,z}
produkują trzy znakix
,y
az
.W twoim przypadku możesz bezpiecznie używać
cat file.{1..3} > file
Teraz, w przypadku
cat file.*>file
, użyłeś globowania powłoki , który tworzy wszystkie nazwy plików zaczynające się od,file.
a wynik zostanie posortowany na podstawie kolejności sortowania w bieżących ustawieniach narodowych.Nadal jesteś bezpieczny, ale już nie, gdy masz więcej niż 10 plików.
{1..10}
da ci1 2 3 4 5 6 7 8 9 10
. Podczas korzystania z globowania dostaniesz1 10 2 3 4 5 6 7 8 9
źródło
Różnica polega na tym, że jedna jest listą, a drugą sekwencją.
{1,2,3}
rozszerza się do trzech konkretnych elementów1
,2
oraz3
.{1..3}
rozwija się do listy liczb od jednego do trzech. W tym konkretnym przypadku są one takie same i możesz użyć jednego z dwóch.file.*
rozwinie się do wszystkich plików i katalogów w bieżącym katalogu, którego nazwa zaczyna się odfile.
. Jeśli tylko maszfile.1
, tofile.2
ifile.3
to jest równoważne z pozostałymi dwoma.Jeśli chodzi o powodowanie problemów, nie rozumiem dlaczego. Być może myślisz
To jednak zupełnie inna kwestia. Jedynym innym problemem, jaki mogę wymyślić, jest to, że twoja powłoka może nie wyświetlać plików we właściwej kolejności. Na przykład:
Aby rozwiązać ten problem, możesz użyć
zsh
zamiastbash
(zobacz tutaj, aby uzyskać szczegółowe informacje):Zasadniczo trzy podejścia nie są takie same. To zależy od tego, co chcesz zrobić. W tych przypadkach, gdy trzy zwracają to samo wyjście, wtedy, tak, możesz użyć dowolnego z nich. To nie robi różnicy. Wszystkie te rozszerzenia są wykonywane przez powłokę i zdarzają się, zanim zostaną przekazane do dowolnego polecenia, które ich używa.
źródło
*
gdybym miał więcej lub równych 10 plików, jeśli zależę od właściwej kolejności?ARG_MAX
pliki, ale tak będzie znacznie więcej niż 10.cat *
nie jest dobrze zdefiniowany. Wynik zależy od powłoki i środowiska. Zobacz komentarz Sebastiana ..txt
rozwiąże problemufile.*
?Są takie same, ale zależy od zainstalowanej wersji bash, jeśli są one dostępne.
Z tej strony:
źródło