
我正在編寫一個應該在 OSX 和 Ubuntu 上運行的 bash 腳本。我不確定這個特定問題是否是由於作業系統不匹配造成的;更有可能的是兩個 shell 上的 date 指令不同,即使兩個 shell 上都是 bash?讓我們來看看。
在 OSX 的 bash shell 上,為了列印兩天前的日期,我們這樣做:
date -v-2d +"%Y"."%m"."%d"
然而,該-v
標誌在 Ubuntu bash shell 上無效。相反,我們使用:
date --date="2 days ago" +"%Y"."%m"."%d"
不幸的是,--date
我們的 OSX bash shell 無法辨識該標誌。
我想要一個帶有在兩種情況下都有效的標誌的命令,有人知道我可以嘗試什麼嗎?
答案1
date
不是bash
內建的。它是一個系統實用程序,這是 OSX 和 Linux 的不同之處。 OSX 使用 BSD 工具,而 Linux 使用 GNU 工具。它們相似但不相同。
正如你所發現的,在 OSX 上,控制夏令時-d
的標誌,而在 Linux 上,它設定顯示時間。date
在 OSX 上,-v
調整顯示日期,但在 Linux 上,該-v
標誌是無效選項。
在大多數情況下,BSD 和 GNU 都致力於與 POSIX 標準相容。如果你檢查POSIX 標準date
不過,您會發現在這種情況下它沒有幫助:它不支援任何調整日期的語法。
如果您希望程式碼在兩個平台上都能運作,請嘗試:
[ "$(uname)" = Linux ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
或(需要 bash):
[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
答案2
和克什93(恕我直言,這比巴什對於腳本編寫)您可以使用printf
內建函數,例如:
printf '%(%Y.%m.%d)T' '2 days ago'