Есть ли разница между последовательностями {1,2,3}
и {1..3}
?
Например, если у меня есть несколько файлов
file.1
file.2
file.3
и я хочу, чтобы cat
они вместе были безопасны в использовании cat file.{1..3} > file
?
Я знаю, что это cat file.*>file
может вызвать проблемы, потому что оболочка может иногда случайным образом расширять файлы (я думаю, это зависит от inode, не так ли?)
cat file.[123] >file
file.*
не зависит от inode. Он всегда сортирует их лексикографически, что может зависеть от вашего местоположения.file.{1..3}
которая распространяется на все три, независимо от того, существуют они или нет.cat
ошибокfile.[123] not found
или чего-то очень полезного.Ответы:
{1..3}
и{1,2,3}
дать тот же результат, но по-другому.В общем,
{n1..n2}
(который пришел первый изzsh
,bash
иksh
скопировал его позже) , гдеn1
иn2
целые числа производят все числа междуn1
иn2
. Пока{x,y,z}
производят три символаx
,y
аz
.В вашем случае вы безопасно использовать
cat file.{1..3} > file
Теперь, в случае
cat file.*>file
, вы использовали глобирование оболочки , которое выдает все имена файлов, начиная с которых,file.
и результат будет отсортирован по порядку сортировки в текущей локали.Вы все еще в безопасности, но не больше, когда у вас есть более 10 файлов.
{1..10}
даст тебе1 2 3 4 5 6 7 8 9 10
. В то время как с Globbing, вы получите1 10 2 3 4 5 6 7 8 9
источник
Разница в том, что один - это список, а другой - последовательность.
{1,2,3}
расширяется до трех конкретных элементов,1
,2
, и3
.{1..3}
расширяется до списка чисел от одного до трех. В этом конкретном случае они одинаковы, и вы можете использовать любой из двух.file.*
развернется ко всем файлам и каталогам в текущем каталоге, имя которого начинается сfile.
. Если у вас естьfile.1
,file.2
иfile.3
это тоже эквивалентно двум другим.Что касается его проблем, я не понимаю, почему. Вы можете думать о
Это, однако, совершенно другая проблема. Единственная проблема, о которой я могу подумать, заключается в том, что ваша оболочка может не перечислять файлы в правильном порядке. Например:
Чтобы решить эту проблему, вы можете использовать
zsh
вместоbash
( подробности см. Здесь ):В целом, три подхода не совпадают. Это зависит от того, что вы хотите сделать. В тех случаях, когда три возвращают один и тот же результат, да, вы можете использовать любой из них. Это не имеет значения. Все эти расширения выполняются оболочкой и выполняются до того, как они будут переданы любой команде, которая их использует.
источник
*
если бы у меня было больше или равно 10 файлов, если я зависел от правильного порядка?ARG_MAX
файлов, но это будет гораздо больше, чем 10.cat *
не очень хорошо определен. Выход зависит от оболочки и окружающей среды. Смотрите комментарий Себастьяна ..txt
решит проблему сfile.*
?Они одинаковы, но это зависит от версии bash, которую вы установили, если они доступны.
С этой страницы:
источник