我制作了一个可以更新工具的 shell 脚本。我希望当我运行
root@host:# sh script.sh
那么输出将是
Its installing
Its done
但现在我的脚本看起来像
root@host:# sh script.sh
正在安装
显示 internat 脚本工作输出
已完成
据我所知,stty -echo
命令隐藏终端中的 stdin 并stty echo
在终端中启用 stdin 显示。但是我如何通过 shell 脚本隐藏标准输出?
答案1
将 stdout 和 stderr 重定向至/dev/null
:
> /dev/null 2>&1
或者在 bash 中:
&> /dev/null
exec
您可以通过在脚本开头使用重定向对脚本生成的所有程序执行此操作。
exec > /dev/null 2>&1
除非您在脚本中调用的程序直接访问终端(很少见),否则这应该可以覆盖您。
关于重定向的一点说明:
顺序很重要。顺序应该是> /dev/null 2>&1
,而不是2>&1 >/dev/null
。我以前认为后者会起作用,因为>
它看起来像一个箭头,这让我想到了指针(“重定向”这个词也是如此),如果我将 stderr 指向 stdout,然后将 stdout 指向 /dev/null,那么两者都应该指向 /dev/null。但事实并非如此。文件描述符不是指针,将其视为>
对文件描述符的分配比指向更有帮助。(在某种程度上,因为从技术上讲,fd 只是一个数字,您需要系统函数来将dup2
不同的文件打开到同一个文件描述符中;但我认为赋值是一种很好的高级抽象)。