web-dev-qa-db-ja.com

OS Xのカレンダー(cal)での複数月の表示

この記事 にリストされているコマンドのいくつかを実行したいと思っています。例:

cal -3

先月、今月、来月を見せてくれるはずです。

このコマンドは、OS Xでは機能しません

$ cal -3
cal: illegal option -- 3
usage: cal [-jy] [[month] year]
       cal [-j] [-m month] [year]
       ncal [-Jjpwy] [-s country_code] [[month] year]
       ncal [-Jeo] [year]

OS Xで使用できる代替フォームはありますか?

参考のために:

$ which cal
/usr/bin/cal

そして

$ man cal 

これがおそらくデフォルトのOSXバージョンであることを明らかにします:"...BSD General Commands Manual..."

OSXにはLinuxと同じバージョンのユーティリティがありません。信頼できる共通点は [〜#〜] posix [〜#〜] で、これは cal を定義しますが、そのオプションはありません。

Linuxには2つの一般的なバージョンのcalがあります。1つは til-linux (eg on Fedora )からのもので、もう1つはFreeBSDからのもの(eg buntuの場合 )。どちらにも-3オプションがあります。 OSXはFreeBSDに基づいていますが、 そのバージョン-3オプションがない古いバージョンです。

Bash/zshスクリプトでエミュレートできます。

#!/bin/bash
case $# in
  0) month=$(date +%m) year=$(date +%Y);;
  2) month=$1 year=$2;;
  *) echo 1>&2 "Usage: $0 [MONTH YEAR]"; exit 3;;
esac
month=${month#"${month%%[!0]*}"}
if ((month == 1)); then
  previous_month=12 previous_year=$((year-1))
else
  previous_month=$((month-1)) previous_year=$year
fi
if ((month == 12)); then
  next_month=1 next_year=$((year+1))
else
  next_month=$((month+1)) next_year=$year
fi
paste <(cal "$previous_month" "$previous_year") \
      <(cal "$month" "$year") \
      <(cal "$next_month" "$next_year")

私はLinuxバージョンのcalに慣れているので、先に進んで、calncalの実行可能ファイルを含む Debianバージョンのbsdmainutils をに移植しました。あなたが見つけることができる自作の公式 ここ

皮肉なことに、これらのユーティリティは実際にはFreeBSDのアップストリームソースコードからのものですが、Appleは何年もの間それらを更新することを気にしませんでした。

1
b4hand