在Mac中,base64命令没有-w选项。

45
我尝试使用base64,但该脚本在Ubuntu机器上无法成功运行。

我尝试使用base64,但是这个脚本在Ubuntu机器上没有成功运行。

MYCOMMAND=$(base64  commands.sh)
在Ubuntu中,我必须使用

MYCOMMAND=$(base64 -w0 commands.sh)

不幸的是,这个选项在Mac中不存在。我如何编写一个能够在Mac和Ubuntu上都运行的脚本?


也许可以使用一个 PHP 一行代码,调用 base64_encode() 函数对其参数进行编码。 - Mark Setchell
3个回答

91

是的,macOS默认的base64实现没有-w标志。那个标志的作用是什么?

是的,macOS默认的base64实现没有-w标志。那个标志的作用是什么?

-w, --wrap=COLS

将编码后的行在COLS个字符后换行(默认为76个字符),使用0禁用换行。

这是macOS的base64手册页面:

-b count
--break=count

在每个计数字符处插入换行符。默认值为0,这会生成一个不间断的流。

所以,在macOS中,该标志称为-b,它已经默认为0,这意味着在macOS上,base64的行为与Linux上的base64 -w0相同。您需要检测运行平台以使用命令的适当变体。请参见此处:从Bash脚本检测操作系统;您要寻找的macOS平台名称是“Darwin”。


14

在 Mac 上,它是 -b,默认值已经是 0。

$ man base64
...
OPTIONS
     The following options are available:
     -b count
     --break=count        Insert line breaks every count characters. Default is 0, which generates an unbroken stream.
...

让脚本适用于两种情况的一种方法是检查错误:

MYCOMMAND=$(base64 -w0 commands.sh)
if [ $? -ne 0 ]; then
  MYCOMMAND=$(base64 commands.sh)
fi

你也可以运行一个明确的测试,例如

echo | base64 -w0 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  # GNU coreutils base64, '-w' supported
  MYCOMMAND=$(base64 -w0 commands.sh)
else
  # Openssl base64, no wrapping by default
  MYCOMMAND=$(base64 commands.sh)
fi

1

在Linux和MacOS中都适用的解决方案是使用tr命令:

MYCOMMAND=$(base64 commands.sh | tr -d '\n')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接