Ви можете побачити проблему, увімкнувши слід оболонки:
+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr 1 00:00:00 EDT 2016 - 1 month' +%B
February
Коли ви використовуєте висновок внутрішньої dateкоманди, це відбувається на самому початку квітня, а при відніманні місяця виникає розрив через зміну EST / EDT:
+ date -d 'Fri Apr 1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016
Звичайно, ваші результати залежать від місцевих налаштувань часового поясу. Якщо ввімкнути слід, покаже часовий пояс (у моєму випадку EDT).
Причина, по якій результати відрізняються, полягає в тому, що в останньому випадку ви надали більше інформації date, зробили її параметр більш конкретним , тобто конкретним часом доби. У першій частині це не було зазначено, що дало dateбільше свободи щодо того, як визначити дату / час для відображення.
March