Bash
如何在不將變數設置為 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
最終,我想讓電腦執行一定天數,然後中斷並重新啟動,自動登錄,然後重新啟動該過程,以確保電腦連續幾個月保持清醒不會影響性能。
但我還沒有時間研究這個;)
你需要擺脫
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 }')