使用“touch file”和“> file”创建新文件有什么区别?

使用“touch file”和“> file”创建新文件有什么区别?

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

> .gitignore

或者

touch .gitignore

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

答案1

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

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

的行为>取决于 shell。在 bash、dash 和大多数 shell 中,> foo将按预期工作。在 zsh 中,默认情况下,> foo工作方式如下cat > foo- zsh 等待您输入输入。

答案2

这是一个有趣的比较:

$ 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

相关内容