日期管道 - 错误还是我的错误?

xer*_*mus 5 bash pipe date

我遇到了 date 命令的奇怪行为:

echo '1 JAN 2023' | LC_ALL=en_US.utf8  date -d -
Run Code Online (Sandbox Code Playgroud)

这会产生明显错误的输出:

Sun Jun 11 12:00:00 AM CEST 2023
Run Code Online (Sandbox Code Playgroud)

但这没关系:

LC_ALL=en_US.utf8  date -d '1 Jan 2023'  # Sun Jan  1 12:00:00 AM CET 2023
Run Code Online (Sandbox Code Playgroud)

这也可以:

my_date='1 JAN 2023'
LC_ALL=en_US.utf8  date -d  "$my_date" # Sun Jan  1 12:00:00 AM CET 2023
Run Code Online (Sandbox Code Playgroud)

我无法让管道版本工作。是错误还是我做错了什么?

ste*_*ver 17

date命令的--date/-d选项需要一个字符串参数- 标准输入被丢弃,并-根据 GNUdate命令的通用日期语法解析为日期输入字符串,其中表示

当前忽略后面不跟数字的连字符。

空字符串表示今天的开始(即午夜)。

所以你的命令相当于LC_ALL=en_US.utf8 date -d 'today 00:00'.

要从管道获取输入,您需要将 stdin 转换为参数 - 例如xargs

$ echo '1 JAN 2023' | LC_ALL=en_US.utf8  xargs -d '\n' date -d
Sun Jan  1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)

或者(如 Raffa 所建议的)将其传递给读取标准输入的命令,在命令替换中捕获该命令的输出:

$ echo '1 JAN 2023' | LC_ALL=en_US.utf8  date -d "$(cat -)"
Sun Jan  1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)

使用该-f选项要简单得多,它从标准输入中读取:

$ echo '1 JAN 2023' | LC_ALL=en_US.utf8  date -f -
Sun Jan  1 12:00:00 AM EST 2023
Run Code Online (Sandbox Code Playgroud)

man date

   -f, --file=DATEFILE
          like --date; once for each line of DATEFILE
Run Code Online (Sandbox Code Playgroud)