将整个文件读入内存?

将整个文件读入内存?

有没有办法在 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。
  • 将数据存储在临时文件中(这在这里似乎没用,因为数据已经在文件中)。
  • 对输入进行编码并将其解码回来,例如使用base64base64 -d

答案2

一种方法是这样的:

$ A=$(<file)

除了变量之外,更好的选择是读入数组,这样可以更轻松地访问不同的行:

$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS

相关内容