有没有办法在 bash 中将整个文件读入内存,而不使用像这样的外部命令cat
?
我知道从文件中获取输出的语法,即<(/bin/ls)
,但现在我需要将文件读入整个内存,即$A
会保存内容(可能有空,EOF 之类的东西)
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 变量中。如果你想要这个,你有几个选择:
base64
和base64 -d
。这样的一种方式:
$ A=$(<file)
Run Code Online (Sandbox Code Playgroud)
而不是变量,更好的选择是读入一个数组,这样可以更容易地访问不同的行:
$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS
Run Code Online (Sandbox Code Playgroud)