{1,2,3}
和之间的序列有区别吗{1..3}
?
例如,如果我有一些文件
file.1
file.2
file.3
我想将cat
它们放在一起使用安全吗cat file.{1..3} > file
?
我知道这cat file.*>file
可能会导致问题,因为 shell 有时会以随机方式扩展文件(我认为这取决于索引节点,是吗?)
答案1
{1..3}
并{1,2,3}
产生相同的结果,但以不同的方式。
一般来说,{n1..n2}
(首先来自zsh
,bash
后来ksh
复制它)其中n1
和n2
are 整数产生n1
和之间的所有数字n2
。同时{x,y,z}
产生三个字符x
,y
和z
。
就您而言,您可以安全使用cat file.{1..3} > file
现在,在 的情况下cat file.*>file
,您使用了shell 通配符,它生成所有以文件名开头的文件file.
,结果将根据当前语言环境中的排序规则进行排序。
您仍然是安全的,但当您拥有超过 10 个文件时,就不再安全了。{1..10}
会给你1 2 3 4 5 6 7 8 9 10
。当使用通配符时,你会得到1 10 2 3 4 5 6 7 8 9
答案2
区别在于,一个是列表,另一个是序列。{1,2,3}
扩展为三个特定元素1
、2
和3
。{1..3}
扩展到 1 到 3 之间的数字列表。在这种特殊情况下,它们是相同的,您可以使用两者中的任何一个。file.*
将扩展到当前目录中名称以file.
.如果只有file.1
,file.2
那么file.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
一般来说,这三种方法并不相同。这取决于你想做什么。在这三个返回相同输出的情况下,是的,您可以使用它们中的任何一个。没什么区别。所有这些扩展都是由 shell 完成并发生的前它们被传递给任何使用它们的命令。
答案3
它们是相同的,但这取决于您安装的 bash 版本是否可用。
从这页:
{xxx,yyy,zzz,...} probably in all bash versions {a..z} introduced in bash 3 {<START>..<END>..<INCR>} new in bash 4