bash中是否有二进制安全的“三倍小于” <<<运算符?


27

这是一个假设性的问题,所以请不要问我为什么要这样做。

假设我有一个GIF包含二进制数据的变量,并假定我不能使用管道|运算符,则以下应该是使用“三重小于”运算符的正确方法:

openssl enc -base64 <<< $GIF

但是,在我看来,这<<<不是二进制安全的,因此二进制数据已损坏。

有二进制安全等效项吗?


请注意,bash变量不能包含NUL字符。因此$GIF,一开始,您的变量即使在开始之前也没有保持全二进制。但是,除NUL字符外,它保留所有其他字符。(作为参考:vaab.blog.kal.fr/2014/05/03/…
vaab

Answers:


31

这里串的重定向(<<<)是一个简单的形式,这里的文件重定向(<<)。这里的字符串重定向不是“二进制安全的”;Bash将在here字符串上执行扩展。另外,Bash会在here字符串的末尾添加换行符(发出命令xxd -p <<< "foo",您将得到666f6f0a回报)。

I / O重定向是您唯一安全的选择(不包括管道)。

这里没有类似二进制的安全问题。您可以存储编码的数据并尝试

COMMAND_WITH_BIN_INPUT <(uudecode <(echo "$uuEncodedData")) 

但这不远

echo "$uuEncodedData"|uudecode|COMMAND_WITH_BIN_INPUT

但没有管道metachar。


1
或者,尝试一下od -a <<< "",您将看到nl而不是十六进制值。
jcalfee314 2014年

@Wesley也有archive.org。:)原始链接:web.archive.org/web/20120126213653/http
Jason C

4

Bash通常不是二进制安全的,并且在替换期间会破坏包含二进制内容的变量中的null和换行符。

因此,我认为答案是“否”,而从根本上来说是“不是在Shell脚本语言中”,因为它们似乎都存在二进制问题。

我会说,但是您打算将数据放入$ GIF,而是将其放入文件,或者使用python作为替代脚本语言来处理二进制数据而不会出现问题。


1
引用或精确度,或者简单的示例比您的野蛮猜测和一般感觉更有帮助。有几种方法可以通过bash解析二进制数据。
vaab
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.