我是 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