{1,2,3}与{1..3}之间的差异


17

有序列之间的差异{1,2,3}{1..3}

例如,如果我有一些文件

file.1
file.2
file.3

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

我所知道的是,这cat file.*>file可能会引起问题,因为Shell有时会以随机方式扩展文件(我认为这取决于inode,对吗?)


1
使用cat file.[123] >file
mikeserv

3
的扩展顺序file.*不依赖于索引节点。它总是按字典顺序对它们进行排序,这可能取决于您的定位设置。
Barmar

1
“取决于inode”听起来像是来自经过研究的犯罪意识很强的“计算机”场景之一的阶段。
亚历克·蒂尔

1
@mikeserv,我相信我明白了—它是一个外壳程序,因此它只能扩展到实际存在的文件,对吗?VS. file.{1..3}无论它们是否存在,它都会扩展到所有三个。
通配符

1
@Wildcard-是的,只要至少存在一个。如果不是的话,它根本不会扩展,并且会cat出错file.[123] not found或非常有用。
mikeserv '16

Answers:


18

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

在一般情况下,{n1..n2}(其最初来自zshbashksh随后复制它),其中n1n2是整数生产之间的所有数字n1n2。同时{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。在使用globbing时,您会得到1 10 2 3 4 5 6 7 8 9


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

但是,那是一个完全不同的问题。我能想到的唯一另一个问题是您的shell可能未按正确的顺序列出文件。例如:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

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

% echo f*(n)
file1 file2 file11

通常,这三种方法并不相同。这取决于您想做什么。如果这三个实例返回相同的输出,可以,您可以使用它们中的任何一个。没有什么不同的。所有这些扩展都是由外壳程序完成的,并在将它们传递给使用它们的任何命令之前进行。


*如果我依赖于正确的顺序,是否有10个以上的文件不会有问题?
syss 2015年

1
@syss号 这将是一个问题,如果你有以上的ARG_MAX文件,但是,这将是方式,方法10余项
terdon

1
@terdon他在问它们是否会按数字顺序显示(即不是“ 1、10、2”),而不是它们是否会使参数数组溢出。
Random832

3
@terdon我认为@syss的输出cat *定义不正确是正确的。输出取决于外壳和环境。参见塞巴斯蒂安的评论
Marco Marco

不会添加.txt解决问题file.*吗?
Ismael Miguel 2015年

6

它们是相同的,但是取决于可用的bash版本。

页面上:

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

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.