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的工作不是创建具有特定名称的文件,而只是创建文件。但是,正如您已经被告知的那样,有许多更有效和优雅的方法来创建具有给定名称的文件,为此提供命令将毫无意义。
也就是说,您还有truncate和fallocate两者的基本目的都是创建文件。他们只是有一个更复杂的方法。永远不会有一个简单的程序可以执行该> 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)