重定向到/ dev / null

Modified on: Sat, 30 Jun 2018 11:01:30 +0800

我正在阅读一个示例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来优雅地忽略错误,而不会导致脚本崩溃(有点像编程语言中的try catch异常处理)。因为我没有看到使用tar将目录压缩到tar文件中可能会导致任何类型的错误。

最佳答案

不,这不会阻止脚本崩溃。如果tar进程中出现任何错误(例如:权限被拒绝,没有这样的文件或目录,......),脚本仍会崩溃。

因为使用> /dev/null 2>&1将所有命令输出(stdoutstderr)重定向到/dev/null,表示没有输出打印到终端。

默认情况下:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

在脚本中,您使用> /dev/null导致:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

然后2>&1导致:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

相关问答

添加新评论