创建新文件时,使用“触摸文件”和“>文件”有什么区别?


13

我是Linux新手。当我使用bash在当前目录下创建一个新文件.gitignore时,发现可以执行以下操作:

> .gitignore

要么

touch .gitignore

看来他们做同样的事情。当我查看手册时touch,它说更改当前文件的时间戳,但是没有手册>。那么有人可以解释一下该怎么>做,在这种情况下使用这两个命令有什么区别吗?谢谢。


1
我很好奇您在哪里学习了使用'>'作为文件生成器而又没有学习它的预期用途
forresthopkinsa

1
您会发现Bash手册中记录了重定向。在命令行中,输入命令man bash。这是一个很长的文档,需要花费几天甚至几周的时间才能很好地理解,但是如果您想全面学习Bash,则值得一读。
帕迪·兰道

Answers:


21

>是Shell重定向运算符。请参阅shell命令中的“>”和“ >>”有什么区别?什么时候应该使用<或<()或<<和>或>()?它主要用于将命令的输出重定向到文件。如果该文件不存在,则外壳程序将创建它。如果存在,则外壳程序截断(清空)。使用just时> file,没有命令,因此外壳程序会创建一个文件,但不会向其发送任何输出,因此,最终的效果是创建一个空文件或清空现有文件。

touch是一个外部命令,用于创建文件或更新时间戳,如您所知。使用touch,与不同,文件内容不会丢失(如果存在)>

的行为>取决于外壳。在bash,破折号和大多数shell中,它们> foo将按预期工作。在zsh中,默认情况下的> foo工作方式类似于cat > foo-zsh等待您输入内容。


10
这里的关键点是两者之间没有实际的区别>> filetouch file但是如果file不存在,则两者之间会有很大的区别> file(因为先前内容file丢失了)。加上zsh行为的不一致,这touch file是“最安全的”,因此应记为“正确的方法”。
Monty Harder

1

这是一个有趣的比较:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

结果:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
尽管比较可能很有趣,但我并没有真正看到您希望我在这里看到的内容。你能解释你要做什么吗?我猜这是将内容写入文件的不同方法,但是我发现这样有点混乱。可能是我缺少咖啡。
m00am

@ m00am此处显示的实际上是创建文件的8种不同方式。strace应该显示正在执行的系统调用,而> file.txt方法显示为执行的系统调用最少,这真的不足为奇-工具越复杂,其系统调用就越复杂。但是,所示示例的问题是默认情况下会strace写入stderr流,而在此答案中,史蒂文使用管道仅读取stderr,因此我有点困惑他如何使用|管道而不是管道来计数行|&
Sergiy Kolodyazhnyy

而在Ubuntu 16.04,使用|&,作为@Serg提到,我得到这里的人的五分之一计数...除外vi情况下,当我得到相同的值
穆鲁

WSL?哇......我没想到会WSL补充它所做了很多系统调用。
muru

@muru Cygwin-WSL尚未准备就绪stackoverflow.com/a/40370009
Steven Penny
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.