linux 脚本 devnull,/dev/null在shell脚本中的含义是什么?

问题描述

但是我遇到了第一个脚本:

cd /var/log

cat /dev/null > messages

cat /dev/null > wtmp

echo "Log files cleaned up."

第2行和第3行在Ubuntu中做了什么(我理解cat)?它只适用于其他Linux发行版吗?以root身份运行此脚本后,我得到的输出是Log files cleaned up.但/var/log仍然包含所有文件。

最佳解决方法

cat将列出在cat之后传送到标准输出的文件的内容,并且>将其发送到文件messages和wtmp,其中>表示首先删除文件的所有内容并且>>将意味着添加到当前文件。在这种情况下,您使用>所以文件最终会变空。

现在为踢球者:/dev/null是一个将’nothing’发送到>后面的2个文件的设备。

这样做是有原因的:文件不会从系统中删除。如果您将rm然后执行touch messages权限可能是错误的,如果只是在rm之后,某些东西会想要写入文件,那么它就会消失并出错。根据软件的创建方式,它可能会崩溃。

次佳解决方法

假设命令成功,/var/log/messages和/var/log/wtmp仍然存在,但现在是空白的。

Shell重定向

>是一个重定向运算符,由shell实现。它的语法是:

command > file

这将command的standard output重定向到file。

如果file不存在,则将其创建为regular file。

如果file已作为常规文件存在且为non-empty,则会被覆盖。这通常是在你重定向cat /dev/null的输出messages和wtmp你运行命令的情况下。

如果file已作为symbolic link存在,则使用链接的目标。

如果file已作为目录存在,您将收到类似bash: file: Is a directory的错误。

(当然,这些操作可能由于其他原因而失败,例如缺少permissions或文件系统错误。)

>>重定向运算符类似,但它附加到non-empty常规文件的末尾,而不是覆盖其内容。 (另一个重定向运算符是<.command file input>

null设备

/dev/null是一个简单的设备(用软件实现,不对应系统上的任何硬件设备)。

当您从中读取/dev/null时,它看起来是空的。

写入/dev/null不执行任何操作:写入此设备的数据只是”disappear.”

通常,通过将命令的标准输出重定向到/dev/null来使其静音,这可能是null设备在shell脚本中最常用的:

command > /dev/null

您使用/dev/null的方式不同。 cat /dev/null输出/dev/null的”contents”,也就是说它的输出是空白的。 > messages(或> wtmp)会将此空白输出重定向到>运算符右侧的文件。

由于messages和wtmp是常规文件(而不是例如设备节点),因此它们被转换为空白文件(即,清空)。

您可以在>的左侧使用任何不执行任何操作且不产生输出的命令。

清除这些文件的另一种方法是运行:

echo -n > messages

echo -n > wtmp

-n标志是必需的,或者echo写入newline字符。

(这总是适用于bash。我相信今天广泛使用的每个GNU /Linux发行版和其他Unix-like系统中的默认sh都支持其echo内置的-n标志。但是对于真正的可移植shell脚本应该避免使用echo -n的jlliagre is right,它不需要工作。也许这就是为什么the guide you’re using教导cat /dev/null的方式。)

echo -n方式的效果相当,但可以说是更好的解决方案,因为它更简单。 cat /dev/null > file打开三个”files”:

cat可执行文件(通常为/bin/cat),一个常规文件。

/dev/null设备。

file

相反,echo -n > file仅打开file(echo是壳内含子)。

虽然这应该可以提高性能,但这并不是好处 – 不管是手动运行几个这样的命令,无论如何。相反,好处是更容易理解正在发生的事情。

重定向和普通(空白/空)命令。

作为jlliagre has pointed out(另请参阅jlliagre’s answer),只需省略>左侧的命令即可进一步缩短。虽然您不能省略>或>>表达式的右侧,但空白命令有效(这是您在空提示下按Enter时运行的命令),而省略左侧则只是重定向该命令的输出。

请注意,此输出不包含换行符。当您在命令提示符下按Enter时 – 无论您是否键入了任何内容 – shell(以交互方式运行)在运行发出的命令之前打印换行符。此换行符不是命令输出的一部分。

从空白命令(而不是从cat /dev/null或echo -n)重定向看起来像:

&gt messages

&gt wtmp

第三种解决方法

正如已经回答的那样,这两行正在清除/var/log/messages和/var/log/wtmp文件的内容,或者在它们尚不存在的情况下创建它们。

然而,它们基于一个完善的城市传奇,赋予/dev/null “paranormal”权力。

它实际上没有,所以cat /dev/null浪费了击键,时间和CPU周期,因为它绝对没有输出。 Eliah Kagan的回复表明使用echo -n的更好方法。这是更好但不可移植到某些shell /OS,它可能会将’-n‘字符串放入这些文件中。

您可以进一步使用便携式和更简单的命令替换这些命令:

cd /var/log

: > messages

: > wtmp

echo "Log files cleaned up."

对于大多数shell(但不是基于csh的shell),您可以更进一步并删除no-op命令’:‘:

cd /var/log

> messages

> wtmp

echo "Log files cleaned up."

第四种方法

>是输出重定向运算符。它将命令输出重定向到它后面提到的文件而不是标准输出设备,截断或覆盖文件的内容。

例如ls -l > demo.txt。执行此命令后,”demo.txt”将包含输出ls -l命令。

接下来就是这个/dev/null。 /dev/null是空文件Is是一个不包含任何内容的特殊文件。

所以当你执行命令时

cat /dev/null > messages

cat /dev/null > wtmp

它通过用EOF(文件结束)字符覆盖来清除”messages”和”wtmp”文件的内容。

所以这里你没有清除你的/var/log目录,但是你正在清除这两个文件的内容。

参考资料

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值