23

日付文字列操作を行う必要があるシェル スクリプトを作成しています。スクリプトはできるだけ多くの *nix バリアントで機能する必要があるため、マシンに BSD または GNU バージョンの date が含まれている可能性がある状況を処理する必要があります。

正しい日付フラグを送信できるように、OS の種類をテストする最もエレガントな方法は何でしょうか?

編集: 明確にするために、私の目標は、BSD と GNU で異なるように見える日付の相対日付計算ツールを使用することです。

BSD の例

date -v -1d

GNU の例

date --date="1 day ago"
4

4 に答える 4

17

date必ずしも OS のバージョンではなく、使用しているコマンドのバージョンを検出する必要があります。

GNU Coreutilsdateコマンドはオプションを受け入れ--versionます。他のバージョンは次のことを行いません:

if date --version >/dev/null 2>&1 ; then
    echo Using GNU date
else
    echo Not using GNU date
fi

しかし、William Pursell が示唆するように、可能であれば両方に共通の機能を使用する必要があります。

( GNU date で利用可能なオプションは、BSD バージョンで利用可能なオプションのほとんどのスーパーセットであると思います。その場合、BSD バージョンを想定するコードは GNU バージョンで動作するはずです。)

于 2012-01-05T19:13:03.530 に答える
11

ポータブル フラグを使用します。規格はこちらから入手できます

相対日付を出力するという特定の問題については、おそらく日付よりも perl を使用する方が簡単です:

perl -E 'say scalar localtime(time - 86400)'

(この解決策は 23 時間または 25 時間の日に完全に失敗することに注意してください。しかし、この問題に対処するための多くの perl 解決策が利用可能です。perl faq を参照してください。)

しかし、確かにキースのアイデアのバリエーションを使用して、次のことを行うことができます。

if date -v -1d > /dev/null 2>&1; then
  DATE='date -v -1d'
else
  DATE='date --date="1 day ago"'
fi
eval "$DATE"

あるいは単に

DATE=$(date -v -1d 2> /dev/null) || DATE=$(date --date="1 day ago")

もう 1 つのアイデアは、使用する関数を定義することです。

if date -v -1d > /dev/null 2>&1; then
    date1d() { date -v -1d; }
else
    date1d() { date --date='1 day ago'; }
fi
于 2012-01-05T19:01:11.610 に答える
1

あなたの質問に答えるには、おそらく「uname -o」が必要です。私の場合は「GNU/Linux」です。OS の種類を検出する価値がないかどうかは、自分で判断できます。

于 2012-01-05T20:44:20.033 に答える