Різниця полягає в тому, що один - це список, а інший - послідовність. {1,2,3}розширюється до трьох конкретних елементів, 1, 2, і 3. {1..3}розширюється до списку чисел від одного до трьох. У цьому конкретному випадку вони однакові, і ви можете використовувати будь-яке з двох. file.*розшириться на всі файли та каталоги в поточному каталозі, з якого починається ім'я file.. Якщо у вас є тільки file.1, то file.2і file.3це теж еквівалентно двом іншим.
Що стосується її спричинення проблем, я не розумію, чому. Ви можете задуматися
$ cat file.* > file.txt
cat: file.txt: input file is output file
Це, однак, зовсім інше питання. Єдина інша проблема, яку я можу придумати, - це те, що ваша оболонка може не перераховувати файли у правильному порядку. Наприклад:
$ touch file1 file11 file2
$ echo file*
file1 file11 file2
Щоб вирішити це, ви можете використовувати zshзамість bash(детальніше див. Тут ):
% echo f*(n)
file1 file2 file11
Загалом, три підходи не однакові. Це залежить від того, що ви хочете зробити. У тих випадках, коли троє повертають один і той же результат, так, так, ви можете використовувати будь-який з них. Це не має ніякої різниці. Усі ці розширення виконуються оболонкою і відбуваються до того, як вони будуть передані будь-якій команді, яка їх використовує.
cat file.[123] >file