在Mac中,base64没有-w选项

amb*_*air 5 macos ubuntu base64

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

MYCOMMAND=$(base64  commands.sh)
Run Code Online (Sandbox Code Playgroud)

所以在Ubuntu中,我必须使用

MYCOMMAND=$(base64 -w0 commands.sh)
Run Code Online (Sandbox Code Playgroud)

很遗憾,Mac中没有此选项.如何编写一个在Mac和Ubuntu中运行的脚本

dec*_*eze 24

是的,默认的macOS base64实现没有-w标志.那面旗子做什么?

-w, --wrap=COLS
Run Code Online (Sandbox Code Playgroud)

在COLS字符后包装编码行(默认为76).使用0禁用换行.

这是macOS手册页base64:

-b count
--break=count
Run Code Online (Sandbox Code Playgroud)

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

因此,该标志-b在macOS中被调用,并且它已经默认为0,这意味着base64在macOS中具有与base64 -w0在Linux上相同的行为.您必须检测您运行的平台才能使用该命令的相应变体.请参见此处:从Bash脚本中检测操作系统 ; 您正在寻找macOS的平台名称是"Darwin".


ori*_*rip 10

在 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.
...
Run Code Online (Sandbox Code Playgroud)

让脚本同时工作的一种方法是检查错误:

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

您还可以运行显式测试,例如

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
Run Code Online (Sandbox Code Playgroud)


Eri*_*ric 2

一种同时适用于 Linux 和 MacOS 的解决方案是使用tr

MYCOMMAND=$(base64 commands.sh | tr -d '\n')
Run Code Online (Sandbox Code Playgroud)