{1,2,3} 和 {1..3} 之间的区别

sys*_*yss 17 bash

序列{1,2,3}和之间有区别{1..3}吗?

例如,如果我有一些文件

file.1
file.2
file.3
Run Code Online (Sandbox Code Playgroud)

我想把cat它们放在一起使用安全cat file.{1..3} > file吗?

我知道这cat file.*>file可能会导致问题,因为外壳有时会以随机方式扩展文件(我认为这取决于 inode,是吗?)

cuo*_*glm 18

{1..3}{1,2,3}产生相同的结果,但方式不同。

一般来说,{n1..n2}(首先来自zshbash然后ksh复制它) wheren1n2are integers 产生n1和之间的所有数字n2。同时{x,y,z}产生三个字符xyz

在您的情况下,您可以安全使用 cat file.{1..3} > file

现在,在 的情况下cat file.*>file,您使用了shell globbing,它生成所有文件名开头,file.结果将根据当前语言环境中的排序规则排序。

您仍然是安全的,但当您有 10 个以上的文件时就不再安全了。{1..10}会给你1 2 3 4 5 6 7 8 9 10。使用通配符时,您将获得1 10 2 3 4 5 6 7 8 9


ter*_*don 8

区别在于一个是列表,另一个是序列。{1,2,3}扩展为三个特定元素12、 和3{1..3}扩展到一到三之间的数字列表。在这种特殊情况下,它们是相同的,您可以使用两者中的任何一个。file.*将扩展到当前目录中名称以file.. 如果你只有file.1file.2file.3那么也相当于其他两个。

至于它造成的问题,我不明白为什么。你可能会想到

$ cat file.* > file.txt
cat: file.txt: input file is output file
Run Code Online (Sandbox Code Playgroud)

然而,这是一个完全不同的问题。我能想到的唯一另一个问题是您的 shell 可能没有以正确的顺序列出文件。例如:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,您可以使用zsh代替bash(请参阅此处了解详细信息):

% echo f*(n)
file1 file2 file11
Run Code Online (Sandbox Code Playgroud)

一般来说,这三种方法并不相同。这取决于你想做什么。在这三个返回相同输出的情况下,是的,您可以使用它们中的任何一个。没有什么不同的。所有这些扩展都是由 shell 完成的,并且它们被传递给使用它们的任何命令之前发生。

  • @terdon 我认为 @syss 是正确的,`cat *` 的输出没有明确定义。输出取决于外壳和环境。参见 [Sebastian 的评论](http://unix.stackexchange.com/questions/153011/how-do-i-distribute-a-large-download-over-multiple-computers/153017#comment249945_153017)。 (3认同)

cri*_*sti 6

它们是相同的,但这取决于您安装的 bash 版本是否可用。

这个页面:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
Run Code Online (Sandbox Code Playgroud)