我正在阅读bash shell脚本示例:
#!/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文件中的方式可能会导致任何类型的错误。

评论

重定向到/ dev / null不会阻止崩溃,但是会清理stdout和stderr输出流。 tar可能以多种方式导致错误。您可能没有写权限,文件可能已经存在,等等。

这只是避免不必要输出的一种技巧。至于tar会导致错误的原因:因为目标目录不存在,因为源目录不存在,因为您没有对目标的写访问权,也没有对源的读取权限,因为tar不在$ PATH中,因为tar崩溃(您永远不会知道),因为设备上没有空间,因为tar版本已更改,现在需要使用不同的语法,因为磁盘导致了I / O错误。我相信您可以找到更多。

#1 楼

不,这不会阻止脚本崩溃。如果tar进程中发生任何错误(例如:权限被拒绝,没有此类文件或目录,...),脚本仍将崩溃。 (分别是> /dev/null 2>&1stdout)到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之前添加了重定向。 )

以上内容会将STDOUTSTDERR重定向到/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




> filenamestdout重定向到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