Bash

如何在不將變數設置為 null 的情況下從腳本開頭刪除錯誤?

  • July 20, 2021

我遇到了一個問題,$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 

最終,我想讓電腦執行一定天數,然後中斷並重新啟動,自動登錄,然後重新啟動該過程,以確保電腦連續幾個月保持清醒不會影響性能。

但我還沒有時間研究這個;)

你需要擺脫uptime它的標準錯誤的輸出:

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

&>/dev/null將標準輸出和標準錯誤都重定向到位桶,因此您最終沒有要處理的輸出,並且您的變數設置為空字元串。2>/dev/null僅重定向標準錯誤,消除任何錯誤消息,但保留正常輸出。

注意awk可以做任何事情grep並且sed可以;我不知道uptime您系統上的確切輸出,但在我的系統上,以下工作:

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

引用自:https://unix.stackexchange.com/questions/658695