Joh*_*ino 227 shell-script null
我正在阅读一个示例 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
Run Code Online (Sandbox Code Playgroud)
我试图了解/dev/null 2>&1这里的用法。起初,我认为这个脚本/dev/null是为了优雅地忽略错误,而不会导致脚本崩溃(有点像编程语言中的 try catch 异常处理)。因为我不知道如何使用 tar 将目录压缩为 tar 文件可能会导致任何类型的错误。
cuo*_*glm 331
不,这不会阻止脚本崩溃。如果过程中发生任何错误tar(例如:权限被拒绝,没有这样的文件或目录,...)脚本仍然会崩溃。
这是因为 using> /dev/null 2>&1会将您的所有命令输出(包括stdout和stderr)重定向到/dev/null,这意味着没有输出打印到终端。
默认情况下:
stdin ==> fd 0
stdout ==> fd 1
stderr ==> fd 2
Run Code Online (Sandbox Code Playgroud)
在脚本中,您使用了> /dev/null引起:
stdin ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2
Run Code Online (Sandbox Code Playgroud)
然后2>&1导致:
stdin ==> fd 0
stdout ==> /dev/null
stderr ==> stdout
Run Code Online (Sandbox Code Playgroud)
Thy*_*yag 27
要轻松理解“重定向到 /dev/null”,请明确写出。下面是一个尝试删除不存在的文件的示例命令(以模拟错误)
rm nonexisting.txt 1>/dev/null 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
以下是一些增强功能。
增强功能 1:您可以替换1>为 just >。这是因为1是默认标准输出,您可以忽略提及默认值。
rm nonexisting.txt >/dev/null 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
增强功能 2:您可以/dev/null用 &1替换第二个。这是因为/dev/null是通过标准输出1已经指出来。
rm nonexisting.txt 1> /dev/null 2> &1
Run Code Online (Sandbox Code Playgroud)
我的建议:坚持第一个选项。明确地写出命令而不是使用指针。几乎不需要额外的努力,但更容易理解和解释。
dev*_*ull 25
我试图在这里了解 "> /dev/null 2>&1" 的用法。
(请注意,我之前/dev/null在您的问题中添加了重定向。)
以上将重定向STDOUT和STDERR到/dev/null。它通过合并STDERR成STDOUT。(基本上,命令的所有输出都将重定向到空设备。)
...不会导致脚本崩溃(有点像编程语言中的 try catch 异常处理)。
它不太像 atry/catch或任何东西。它只是使命令的任何类型的输出(包括错误)静音。
因为我不知道如何使用 tar 将目录压缩为 tar 文件可能会导致任何类型的错误。
由于多种原因,它可能会导致错误,包括:
小智 21
当你运行 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 的错误仍在写入控制台。