#!/bin/bash
# This script makes a backup of my home directory.
cd /home
# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1
# First remove the old bzip2 file. Redirect errors because this generates some if the archive
# does not exist. Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar
# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1
# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log
我试图在这里了解
/dev/null 2>&1
的用法。起初,我以为这个脚本使用/dev/null
来优雅地忽略错误,而又不会导致脚本崩溃(有点像用编程语言尝试捕获异常处理)。因为我看不到使用tar将目录压缩到tar文件中的方式可能会导致任何类型的错误。#1 楼
不,这不会阻止脚本崩溃。如果tar
进程中发生任何错误(例如:权限被拒绝,没有此类文件或目录,...),脚本仍将崩溃。 (分别是> /dev/null 2>&1
和stdout
)到stderr
,这意味着没有输出输出到终端。默认情况下:您使用
/dev/null
引起:stdin ==> fd 0
stdout ==> fd 1
stderr ==> fd 2
,然后
> /dev/null
引起:stdin ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2
评论
可能不太重要,但是fd是什么?
–kev
16年7月28日在0:13
@kev en.wikipedia.org/wiki/File_descriptor
– Alex Bitek
16/09/11在10:56
为什么:CMD> / dev / null 2>&1起作用,但是CMD 2>&1> / dev / null仍然给我STDERR?
– dbmikus
17年1月14日在16:39
推荐:在代码示例中使用2>&1强调数字和&符号被认为是重定向运算符的一部分。重定向到文件通常在>和/ path / to / file之间有一个空格,重定向到文件描述符本质上是同一回事。
–汉克·兰格维德
18年5月7日在10:25
@dbmikus您应该已经问过一个单独的问题:)不过,第一个问题是“将文件描述符1的重定向写到/ dev / null,然后将文件描述符2的重定向写到与文件描述符的写相同的位置1要去”。第二个说:“将对文件描述符2的重定向重定向到与对文件描述符1的写入进行的相同的位置,然后将对文件描述符1的重定向重定向到/ dev / null”。我也为此感到挣扎。来自同事和unix.stackexchange.com/a/497215/12428的想法,以进行详细描述。
–törzsmókus
19年5月23日在12:45
#2 楼
我想在这里理解“> / dev / null 2>&1”的用法。
(请注意,我在问题中的
/dev/null
之前添加了重定向。 )以上内容会将
STDOUT
和STDERR
重定向到/dev/null
。通过将STDERR
合并到STDOUT
来工作。 (基本上,该命令的所有输出都将重定向到空设备。) 。它不像是
try/catch
或其他任何东西。它只是使命令的任何形式的输出(包括错误)静音。因为我看不到如何使用tar将目录压缩到tar
文件中会导致任何类型的错误。
由于多种原因可能导致错误,包括:
文件权限不足)您正在尝试存档或试图写入的文件上
磁盘空间不足,无法创建存档
#3 楼
运行CMD> / dev / null 2>&1时,STDOUT重定向到/ dev / null,然后STDERR重定向到STDOUT的地址,该地址已设置为/ dev / null,因此两者相反,STDOUT和STDERR指向/ dev / null
相反,当您运行CMD 2>&1> / dev / null
时,STDERR重定向到STDOUT的地址(文件描述符1在那一刻,或者/ proc / self / fd / 1),然后STDOUT重定向到/ dev / null,但是STDERR继续重定向到fd1!结果,STDOUT的正常输出被丢弃,但是来自STDERR的错误仍被写入控制台。
评论
将stdout和stderr都重定向到/ dev / null的更简单的方法是:command&> / dev / null。
– TNT
20年1月16日在18:24
&> / dev / null在脚本文件中对我不起作用,在脚本完成后输出整个stderr,但是> / dev / null 2>&1很好。
–vstepaniuk
20-2-1在13:20
#4 楼
为了易于理解,请明确将其写出。下面是一个示例命令,尝试删除不存在的文件(以模拟错误)。rm nonexisting.txt 1>/dev/null 2>/dev/null
1用于stdout。将信息日志发送到/ dev / null
2用于stderr。将错误日志发送到/ dev / null
以下是几个增强功能。
增强功能1:您可以仅用
1>
替换>
。这是因为1
是默认标准输出,您可以忽略提及默认值。 rm nonexisting.txt >/dev/null 2>/dev/null
增强功能2:您可以将第二个
/dev/null
替换为&1。这是因为标准输出1已指向/dev/null
。rm nonexisting.txt 1> /dev/null 2> &1
我的建议:坚持第一种选择。显式地写出命令,而不要使用指针。花费很少的精力,但更容易理解和解释。
评论
这实际上是一个更好的答案,因为它是一个“ this that that”,而不是一个通用的“ this that that”
– NONONONONO
20-10-2在6:54
太棒了,我多年来一直在努力理解这个主题,最后我知道如何使用它。明确的命令是解释和记忆的最佳方法。
–梅尔·加贝(Meir Gabay)
20-11-24在13:27
#5 楼
cat nonexistantfile.txt &>/dev/null
这会将两个STDOUT都重定向到STDIN
,并等效于
cat nonexistantfile.txt >/dev/null 2>&1
#6 楼
Bash I / O重定向此代码:
command > filename 2>&1
> filename
将stdout
重定向到filename
(
2>&1
)将stderr
重定向到stdout
(现在是filename
) > 这是ABSG的说明(第20章)。
另一个常见示例:
command >>/dev/null 2>&1
将
>
和1>
重定向到stderr
...这意味着无处。发送到stdout
的内容不会以任何方式保存,缓存或记忆。 它们只是被发送到“无处”而被遗忘了。这是一种运行程序并确保其不会产生输出的方式,并且不会在命令行或日志文件中显示该程序。 ...主要是因为自从多年以来我一直没有进行编码,所以我不得不自己查一下。以下是来自ABSG的一些方便信息:
“重定向只是意味着从文件,命令,程序或脚本中捕获输出,并将其作为输入发送到另一个文件,命令,程序,或脚本。“
2>&1
# Redirects stderr to stdout.
command >>filename 2>&1
# Appends both stdout and stderr
#+ to the file "filename" ...
ABSG:高级Bash脚本指南:上面的第20章链接是指向I / O重定向的链接。 tendp.org开源文档的第一个页面,称为Mendel Cooper的Advanced Bash Scripting Guide。它被列为“ shell脚本艺术的深入探索”,我绝对同意。这是一个了不起的资源,对各种疯狂的情况都有很多答案。
其他有价值的资源:在Linux Documentation Project Guides页面上,当前/维护的部分中有许多有价值的资源(采用html,pdf,text等便捷格式)。以下是一些我发现有用的信息:
Machtelt Garrels的入门入门指南
Machtelt Garrels的Linux简介
Gareth Anderson撰写的GNU / Linux命令行工具摘要
Binh Nguyen撰写的Linux文件系统层次结构
安全和优化Linux(仅pdf):Gerhard Mourani的终极解决方案/>
评论
不,重定向从左到右处理。在您的示例中,标准输出重定向到文件名,然后标准错误重定向到标准输出当前要去的任何地方(文件名)。如果相反,标准错误将在终端上终止,而只有标准输出重定向到文件名。同样,在命令> file1 2> file2中,如果无法创建file1,则不会创建file2(无论file1和file2实际上是否完全不同的路径名)。
– Kusalananda♦
19年7月23日在22:41
评论
重定向到/ dev / null不会阻止崩溃,但是会清理stdout和stderr输出流。 tar可能以多种方式导致错误。您可能没有写权限,文件可能已经存在,等等。这只是避免不必要输出的一种技巧。至于tar会导致错误的原因:因为目标目录不存在,因为源目录不存在,因为您没有对目标的写访问权,也没有对源的读取权限,因为tar不在$ PATH中,因为tar崩溃(您永远不会知道),因为设备上没有空间,因为tar版本已更改,现在需要使用不同的语法,因为磁盘导致了I / O错误。我相信您可以找到更多。