序列{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}
(首先来自zsh
,bash
然后ksh
复制它) wheren1
和n2
are integers 产生n1
和之间的所有数字n2
。同时{x,y,z}
产生三个字符x
,y
和z
。
在您的情况下,您可以安全使用 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
区别在于一个是列表,另一个是序列。{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
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 完成的,并且在它们被传递给使用它们的任何命令之前发生。
它们是相同的,但这取决于您安装的 bash 版本是否可用。
从这个页面:
Run Code Online (Sandbox Code Playgroud){xxx,yyy,zzz,...} probably in all bash versions {a..z} introduced in bash 3 {<START>..<END>..<INCR>} new in bash 4