如何在 bash 中抑制 stdout 和 stderr

cec*_*emi 2 bash

当我意识到输出重定向&>在脚本中不起作用时,我试图制作一个小脚本。如果我在终端写

dpkg -s firefox &> /dev/null
Run Code Online (Sandbox Code Playgroud)

或者

dpkg -s firefox 2>&1 /dev/null
Run Code Online (Sandbox Code Playgroud)

我没有输出,但是如果我将它插入到脚本中,它将显示输出。奇怪的是,如果我脚本里面

dpkg -s firefox 1> /dev/null
Run Code Online (Sandbox Code Playgroud)

或者

dpkg -s firefox 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

命令的输出被抑制。我怎样才能同时抑制stderrstdout

Bar*_*mar 13

&>是一个 bash 扩展:&>filename相当于 POSIX 标准>filename 2>&1

确保脚本以 开头#!/bin/bash,以便它能够使用bash扩展。#!/bin/sh运行一个不同的 shell(或者它可能是到 的链接bash,但是当它看到它以这个名称运行时,它会切换到更兼容 POSIX 的模式)。

您几乎可以正确使用2>&1 >/dev/null,但顺序很重要。重定向从左到右执行,因此您的版本将旧版本复制stdoutstderr,然后重定向stdout/dev/null。正确的,可移植的方式来重定向都stderrstdout/dev/null是:

>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)


ped*_*mss 5

使文件描述符 2 (stderr) 写入文件描述符 1 (stdout) 正在写入的位置

dpkg -s firefox >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

这将抑制这两个来源。