macOS 13(Ventura)之前的 macOS 版本中的“base64 -b0”和 macOS 13(Ventura)中的“base64 -i”有什么区别?

macOS 13(Ventura)之前的 macOS 版本中的“base64 -b0”和 macOS 13(Ventura)中的“base64 -i”有什么区别?

直到我最近升级到 macOS 13(Ventura)之前,我都可以运行这个 Bash 命令,在我偶尔使用的脚本中将 JPEG 图像转换为 Base64 字符串:

IMAGE_BASE64=$(base64 -b0 /path/to/image.jpg);

结果IMAGE_BASE64值可以用作$IMAGE_BASE64我的脚本中的变量。

但我最近尝试在 macOS 13(Ventura)中再次使用此脚本,并且该base64命令失败并出现以下错误:

base64: invalid argument -b0
Usage:  base64 [-hDd] [-b num] [-i in_file] [-o out_file]
  -h, --help     display this message
  -Dd, --decode   decodes input
  -b, --break    break encoded string into num character lines
  -i, --input    input file (default: "-" for stdin)
  -o, --output   output file (default: "-" for stdout)

切换命令-i似乎可以解决问题:

IMAGE_BASE64=$(base64 -i /path/to/image.jpg);

但是这两个命令有什么区别呢?

-b0macOS 13(Ventura)之前做了什么-i,现在 macOS 13(Ventura)中正在处理什么?

答案1

将回答我自己的问题。

这里有两个“陷阱”吸引了我,希望这个答案能够帮助将来处于类似情况的人:

  1. 现在需要-b0设置-b 0
  2. 现在-i需要指示输入文件是什么。

因此,在 macOS 13 (Ventura) 中简单地设置-b0是行不通的。需要-b 0 -i。下面有更多详细信息。

-b0与换行符相关,相当于当--break=0该选项设置为0禁用换行符时,这正是人们对 Base64 编码的二进制图像数据所希望的;没有换行符!

详细信息请见此处此 Mac OS X 10.7 手册页base64以及手册页,base64其中说明:

The following options are available for base64:

-b count, --break=count
       Insert line breaks every count characters.  The default is 0,
       which generates an unbroken stream.

知道这一点后,此命令会在 macOS 13 (Ventura) 中中断:

IMAGE_BASE64=$(base64 -b0 /path/to/image.jpg);

-b但是这个轻微的变体,在和0以及-i输入文件的之间有一个空格,可以起作用:

IMAGE_BASE64=$(base64 -b 0 -i /path/to/image.jpg);

但是-i现在输入文件似乎是必需的,而不再仅仅通过路径作为命令中的最后一项来暗示。

真是一个让人困惑不已的头痛。

相关内容