如何从脚本开头删除错误而不将变量设置为 null?

如何从脚本开头删除错误而不将变量设置为 null?

$alive我遇到了一个问题,如果我允许显示以下错误, 我的脚本只会设置变量所需的整数。uptime: /dev/ttys001: No such file or directory

我尝试通过在下面的上下文中添加命令&>/dev/null后面或后面来删除它,uptime

(( uptime | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')&>/dev/null)

或者

( uptime &>/dev/null | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

但这会导致以下情况发生

This computer has been awake for  days

而我需要它来设置变量并像这样执行

This computer has been awake for 32 days

对于我来说,这更像是一个个人项目,旨在了解在 MacOS 中使用 bash 编写脚本,因此非常感谢任何额外的见解!

这是上下文中的脚本。它旨在成为一个无限循环,以使计算机始终保持远程访问状态,并且可以通过简单地终止正在运行的进程来停止。

#!/bin/bash

alive=$( uptime | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

until [[ $alive -lt 0 ]]; do
  Caffeinate -d -t 2
  sleep 2
  echo "This computer has been awake for $alive days"
done 

最终,我想让计算机达到一定的天数,然后中断并重新启动,自动登录,然后再次启动该过程,以确保性能不会因计算机连续几个月处于唤醒状态而受到阻碍。

但我还没有时间去做这件事;)

答案1

您需要摆脱uptime的标准错误输出:

alive=$( uptime 2>/dev/null | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

&>/dev/null将标准输出和标准错误重定向到位桶,所以你最终会得到要处理的输出,并且您的变量设置为空字符串。2>/dev/null仅重定向标准错误,消除任何错误消息,但保留常规输出。

注意,awkcan do everythinggrepsedcan;我不知道uptime你的系统上的确切输出,但在我的系统上,以下是有效的:

alive=$(uptime 2>/dev/null | awk '/up/ { print $3 }')

相关内容