有没有办法在 bash 中将整个文件读入内存,而不使用像 这样的外部命令cat
?
我知道从文件获取输出的语法,即<(/bin/ls)
,但现在我需要将文件读入整个内存,即$A
保存内容(并且可能有 null、EOF 之类的东西)
答案1
Bash 不支持变量中的空字节。foo=$(cat file)
使$foo
包含文件的开头,直到第一个空字节。命令替换还会从文件中删除所有最后的换行符。例如,如果文件由四个字节(a
、 换行符、换行符、换行符)组成,则foo
仅包含a
,就像文件只包含该一个字节一样。
如果要保留最终的换行符,请安排命令输出额外的非换行符,然后将其删除。
foo=$(cat file; echo a)
foo=${foo%a}
到目前为止,这一切都适用于所有 Bourne/POSIX 风格的 shell(ash、ksh、bash……)。 Bash ≥4.0 有一种更快的方式将文件读入变量:mapfile
。
mapfile <file foo
根本没有办法将空字节填充到 bash 变量中。如果您想要这个,您有多种选择:
- 使用 zsh。
- 使用 Perl。
- 将数据存储在临时文件中(这在这里似乎没用,因为数据已经在文件中)。
- 对输入进行编码并将其解码回来,例如使用
base64
和base64 -d
。
答案2
一种方法是这样的:
$ A=$(<file)
除了变量之外,更好的选择是读入数组,这样可以更轻松地访问不同的行:
$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS