$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
仅重定向标准错误,消除任何错误消息,但保留常规输出。
注意,awk
can do everythinggrep
和sed
can;我不知道uptime
你的系统上的确切输出,但在我的系统上,以下是有效的:
alive=$(uptime 2>/dev/null | awk '/up/ { print $3 }')