当我意识到输出重定向&>在脚本中不起作用时,我试图制作一个小脚本。如果我在终端写
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)
命令的输出被抑制。我怎样才能同时抑制stderr和stdout?
Bar*_*mar 13
&>是一个 bash 扩展:&>filename相当于 POSIX 标准>filename 2>&1。
确保脚本以 开头#!/bin/bash,以便它能够使用bash扩展。#!/bin/sh运行一个不同的 shell(或者它可能是到 的链接bash,但是当它看到它以这个名称运行时,它会切换到更兼容 POSIX 的模式)。
您几乎可以正确使用2>&1 >/dev/null,但顺序很重要。重定向从左到右执行,因此您的版本将旧版本复制stdout到stderr,然后重定向stdout到/dev/null。正确的,可移植的方式来重定向都stderr和stdout到/dev/null是:
>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
使文件描述符 2 (stderr) 写入文件描述符 1 (stdout) 正在写入的位置
dpkg -s firefox >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
这将抑制这两个来源。