KM.*_*KM. 24 io-redirection cat
这两个命令在如何将文件清零方面有什么不同吗?后者是做前者的更短的方法吗?幕后发生了什么?
两个都
$ cat /dev/null > file.txt
$ > file.txt
Run Code Online (Sandbox Code Playgroud)
屈服
-rw-r--r-- 1 user wheel 0 May 18 10:33 file.txt
Run Code Online (Sandbox Code Playgroud)
phe*_*mer 29
cat /dev/null > file.txt
是cat的无用用法。
基本上cat /dev/null
只是导致cat
什么都不输出。是的,它有效,但很多人不赞成它,因为它会导致调用一个不必要的外部过程。
这是那些很常见的事情之一,因为它很常见。
使用 just> file.txt
可以在大多数 shell 上工作,但它不是完全可移植的。如果您想要完全便携,以下是不错的选择:
true > file.txt
: > file.txt
Run Code Online (Sandbox Code Playgroud)
两个:
和true
输出没有数据,并且是shell内建(而cat
是外部实用程序),因此它们更轻,更“适当的”。
更新:
正如 tylerl 在他的评论中提到的,还有>| file.txt
语法。
大多数 shell 都有一个设置,可以防止它们通过>
. 您必须>|
改用。这是为了在您真正想要附加>>
. 您可以使用 开启该行为set -C
。
因此,我认为截断文件的最简单、最合适和可移植的方法是:
:>| file.txt
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 24
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
Run Code Online (Sandbox Code Playgroud)
笔记:
sh
或ksh
emulation,对于没有命令的重定向,在 zsh 中,假定默认命令(仅用于 stdin 重定向的寻呼机,cat
否则),可以使用 NULLCMD 和 READNULLCMD 变量进行调整。这是受到类似功能的启发(t)csh
:
在 UnixV7 中没有执行重定向,因为在:
注释前导和空命令之间被解释了一半。后来它们和所有内置函数一样,如果重定向失败,则退出 shell。:
并且eval
是特殊的内置bash
函数,如果重定向失败,则退出 shell(仅在 POSIX 模式下这样做)。(t)csh
,它定义了一个空标签(for goto
),所以goto ''
那里会有分支。如果重定向失败,则退出 shell。$PATH
(:
一般不; true
,cat
,cp
和printf
通常是(POSIX要求它们))。file
但是,如果是指向不存在文件的符号链接,则某些cp
实现(例如 GNU 的实现)将拒绝创建它。(这部分非常主观)
> file
. 这>
看起来太像提示或评论了。另外,我在阅读时会问的问题(大多数 shell 会抱怨相同的问题)是您重定向的输出究竟是什么?.: > file
. :
被称为无操作命令。所以直接读取为生成一个空文件。然而,在这里,:
很容易被遗漏和/或被视为提示。true > file
:与重定向或文件内容有什么关系?这里是什么意思?这是我读到它时想到的第一件事。cat /dev/null > file
. 连接/dev/null
成file
? cat
而往往被视为命令转储文件的内容,仍然是有意义的:转储内容的空文件到file
,有点像一个令人费解的方式来表达cp /dev/null file
,但还是可以理解的。cp /dev/null file
. 将空文件的内容复制到file
. 是有道理的,虽然有人不知道如何cp
意味着默认做可能会认为你在试图让file
一个null
设备也是如此。eval > file
或eval '' > file
。不运行任何内容并将其输出重定向到file
. 我感觉合理。奇怪的是,这不是一个常见的成语。printf '' > file
: 明确地将任何内容打印到文件中。对我来说最有意义的一个。不同之处在于我们是否使用内置的 shell。如果没有,则必须分叉进程,加载并执行命令。
eval
保证在所有 shell 中构建。:
内置于任何可用的地方(Bourne/csh 喜欢)。true
仅内置在类似 Bourne 的 shell 中。
printf
内置了最现代的类似 Bourne 的 shell 和fish
.
cp
并且cat
一般不是内置的。
现在cp /dev/null file
不调用 shell 重定向,所以如下:
find . -exec cp /dev/null {} \;
Run Code Online (Sandbox Code Playgroud)
将比:
find . -exec sh -c '> "$1"' sh {} \;
Run Code Online (Sandbox Code Playgroud)
(虽然不一定比:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
Run Code Online (Sandbox Code Playgroud)
)。
就个人而言,我: > file
在 Bourne-like shell 中使用,并且这些天不使用 Bourne-like shell 以外的任何东西。
您可能想查看truncate
,它的作用正是如此:截断文件。
例如:
truncate --size 0 file.txt
Run Code Online (Sandbox Code Playgroud)
这可能比使用true > file.txt
.
然而,我的主要观点是:truncate
用于截断文件,而使用 > 具有截断文件的副作用。
归档时间: |
|
查看次数: |
20611 次 |
最近记录: |