将整个文件读入内存?

dai*_*isy 7 bash

有没有办法在 bash 中将整个文件读入内存,而不使用像这样的外部命令cat

我知道从文件中获取输出的语法,即<(/bin/ls),但现在我需要将文件读入整个内存,即$A会保存内容(可能有空,EOF 之类的东西)

Gil*_*il' 7

Bash 不支持变量中的空字节。foo=$(cat file)make$foo包含文件的开头,直到第一个空字节。命令替换还会从文件中删除所有最后的换行符。例如,如果该文件由四个字节(的a,换行,换行,换行),然后foo只包含a就像该文件仅包含在一个字节,相同。

如果要保留最后的换行符,请安排命令输出一个额外的非换行符,然后将其去掉。

foo=$(cat file; echo a)
foo=${foo%a}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这一切都适用于所有 Bourne/POSIX 风格的 shell(ash、ksh、bash ……)。Bash ?4.0 有一种更快的方式将文件读入变量:mapfile.

mapfile <file foo
Run Code Online (Sandbox Code Playgroud)

根本没有办法将空字节填充到 bash 变量中。如果你想要这个,你有几个选择:

  • 使用 zsh。
  • 使用 Perl。
  • 将数据存储在一个临时文件中(这在这里似乎没用,因为数据已经在一个文件中)。
  • 对输入进行编码并将其解码回来,例如使用base64base64 -d


Gur*_*uru 6

这样的一种方式:

$ A=$(<file)
Run Code Online (Sandbox Code Playgroud)

而不是变量,更好的选择是读入一个数组,这样可以更容易地访问不同的行:

$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS
Run Code Online (Sandbox Code Playgroud)