为什么没有任何shell命令来创建文件?

Pou*_*uya 28 command-line shell bash files

请注意:

不是在问如何从命令行创建文件!


我多年来一直touch用于制作文件而没有注意到它的主要目的是别的。如果想从命令行创建文件,有很多可能性:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar
Run Code Online (Sandbox Code Playgroud)

而且我确定还有更多。

但事实是,上面的命令实际上都不是为创建文件而设计的。例如,man touch建议此命令用于更改文件时间戳。为什么像 Unix(或 Linux)这样完整的操作系统没有专门用于创建文件的命令?

Adr*_*rth 40

我会说是因为几乎没有必要创建一个空文件,您不会立即在命令行或 shell 脚本中填充内容。

如果可以一步完成,首先创建文件然后使用 I/O 重定向写入文件绝对没有任何好处。

在那些你真的想创建一个空文件并留下它的情况下,我认为这> "${file}"再简单不过了。

TL;DR:它不存在,因为创建空文件通常没有用,如果有的话,已经有无数的选项可以实现这个目标。

附带说明一下,touch仅当文件不存在时使用才有效,而使用重定向的选项将始终截断文件,即使文件存在(因此从技术上讲,这些解决方案并不相同)。> foo是首选方法,因为它节省了 afork并且echo -n通常应避免使用,因为它非常不可移植。


ter*_*don 16

Adrian Frühwirth 的回答是正确的。我只是想补充一点,实际上有一个专门用于创建文件的命令:mktemp.

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM?
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric?
       tions.
Run Code Online (Sandbox Code Playgroud)

当然,mktemp的工作不是创建具有特定名称的文件,而只是创建文件。但是,正如您已经被告知的那样,有许多更有效和优雅的方法来创建具有给定名称的文件,为此提供命令将毫无意义。

也就是说,您还有truncatefallocate两者的基本目的都是创建文件。他们只是有一个更复杂的方法。永远不会有一个简单的程序可以执行该> file操作,因为没有比> file.


mik*_*erv 11

大多数基本的 shell 工具根本不是为任何非常特定的目的而设计的。最基本的外壳工具设计只能与他人互动,以达到你的目的。或者应该说大多数工具只做一件非常基本的事情,而不管它们如何组合以实现目标。

: >./file
Run Code Online (Sandbox Code Playgroud)

这将创建一个空文件。或者根据需要截断现有文件。你可以:

set -o noclobber
Run Code Online (Sandbox Code Playgroud)

避免后一种情况的任何可能性,除非您:

: >|./file
Run Code Online (Sandbox Code Playgroud)

您可以获得与以下类似的行为touch

: >>./file
: >>|./file
Run Code Online (Sandbox Code Playgroud)

除了:不会更新文件的修改时间,因为它没有被修改。

演示

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l
Run Code Online (Sandbox Code Playgroud)

输出

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
Run Code Online (Sandbox Code Playgroud)

不碰

: >>|./echo.file
ls -l 
Run Code Online (Sandbox Code Playgroud)

输出

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
Run Code Online (Sandbox Code Playgroud)

  • 是的,抱歉,我的意思是我的评论无论如何都没有抓住你的答案,对此感到抱歉。 (2认同)