直到我最近升级到 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);
但是这两个命令有什么区别呢?
-b0
macOS 13(Ventura)之前做了什么-i
,现在 macOS 13(Ventura)中正在处理什么?
答案1
将回答我自己的问题。
这里有两个“陷阱”吸引了我,希望这个答案能够帮助将来处于类似情况的人:
- 现在需要
-b0
设置-b 0
。 - 现在
-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
现在输入文件似乎是必需的,而不再仅仅通过路径作为命令中的最后一项来暗示。
真是一个让人困惑不已的头痛。