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

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

请注意:

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


我多年来一直使用touch它来制作文件,但没有注意到它的主要用途是其他的。如果想从命令行创建文件,有多种可能性:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

我确信还有更多。

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

答案1

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

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

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

长话短说:它不存在,因为创建空文件通常没有用处,并且如果有的话,已经有无数的选项可用于实现此目标。

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

答案2

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.

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

也就是说,你也有truncatefallocate两者的本质目的都是创建文件。他们只是有一种更复杂的方法。永远不会有一个简单的程序可以完成该> file功能,因为它不可能比> file.

答案3

大多数基本的 shell 工具都不是设计的为了任何非常具体的目的。最基本的 shell 工具是设计的只是为了达到你的目的而与他人互动。或者也许应该说,大多数工具只做一件非常基本的事情,无论如何组合它们来实现目标。

: >./file

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

set -o noclobber

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

: >|./file

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

: >>./file
: >>|./file

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

演示版

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

输出

-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

请勿触摸

: >>|./echo.file
ls -l 

输出

-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

答案4

该实用程序install实际上是为创建文件而设计的!您可以通过/dev/stdin(在大多数情况下,但是,在大多数版本的 Linux 上,这需要安装)传递文件的内容/proc或提供另一个源文件。您可以设置所有权和权限。

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

作为一个愚蠢的例子。

相关内容