我正在制作一个脚本来更新系统(Ubuntu 22.04),用一个命令更新 apt、flatpak 和 snap 中的所有软件包(如sudo ./update.sh
),并且,如果出现问题,我想将输出保存在一个文件中。我有两种方法可以做到这一点。
一种是用“tee”重定向每个订单的标准输出,例如:
echo "### apt update:\n" | tee update.out
apt update | tee -a update.out
# etc, etc all with "| tee -a update.out"
这是您在编程中希望避免的重复。
我可以做到的另一种方法是使用“tee”调用脚本本身,如下所示:
sudo ./update.sh | tee update.out
但如果我希望默认情况下有这种行为,明智的做法是将其放入脚本中,对吧?
我怎样才能做到这一点,所以当我这样做时sudo ./update.sh
,它会将整个输出发送到屏幕和输出文件?
您可以将此行放在脚本的顶部:
例如:
注意:如果您使用的是 Bash 或 Zsh 以外的 shell,您可能需要替换(以更便携的方式
|&
)2>&1 |
您可以将整个脚本括在大括号中并将输出通过管道传输到
tee
.第一个示例仅在您只想记录标准输出并且不关心错误的情况下使用;请参阅第二个示例以获得更好的解决方案(此示例具有在输出文件中不保留 stderr 的不利/想要的效果,以及在终端中不保留 stdout / stderr 的顺序的不利影响,一般来说,我建议您只使用第二种方法可以正常工作(tm)。
这将记录 stdout 和 stderr,没有副作用:
如果您想将所有内容(整个脚本,stdout 和 stderr)记录到终端和文件中,@bizmutowyszymon 的答案会更好;使用此方法的一个优点是您可以有选择地决定将哪些命令组发送到哪些命令: