変数を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

uptimestderr出力を削除する必要があります。

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

&>/dev/null標準出力と標準エラーをビットバケットにリダイレクトすると、次のようになります。いいえ処理する出力で、変数は空の文字列に設定されます。2>/dev/null標準エラーのみをリダイレクトしてエラーメッセージを削除し、通常の出力はそのままにします。

参考までに、すべての操作awkを実行できます。あなたのシステムから正確な出力がわかりませんが、私のシステムでは次のように動作します。grepseduptime

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

関連情報