
このような外部コマンドを使わずにbashからファイル全体をメモリに読み込む方法はありますかcat
?
ファイルから出力を取得する構文(たとえば)を知っていますが、<(/bin/ls)
今度はファイルをメモリ全体に読み込む必要があります。つまり、$A
内容を保存する必要があります(null、EOFなどがある可能性があります)。
答え1
Bashは変数のnullバイトをサポートしません。最初のヌルバイトまでファイルの先頭を含めfoo=$(cat file)
ます。$foo
コマンド置換はファイルから最後の改行も削除します。たとえば、ファイルが4バイト(a
newline、newline、newline、newline)で構成されている場合、ファイルにはそのバイトのみが含まれているかのように、そのfoo
バイトのみが含まれます。a
最後の改行文字を保持するには、改行ではなく追加の文字を出力するようにコマンドをスケジュールしてから削除します。
foo=$(cat file; echo a)
foo=${foo%a}
これまで、これはすべてのBourne / POSIXスタイルのシェル(ash、ksh、bash ...)で動作します。 Bash ≥4.0には、ファイルを変数として読み取るより高速な方法があります。mapfile
。
mapfile <file foo
bash変数にヌルバイトを入れる方法はありません。これが必要な場合は、次のようないくつかのオプションがあります。
- zshを使用してください。
- パールを使用してください。
- データを一時ファイルに保存します(データはすでにファイルにあるため、ここでは役に立たないようです)。
- 入力をエンコードして再デコードします(例:
base64
と)base64 -d
。
答え2
1つの方法は次のとおりです。
$ A=$(<file)
変数の代わりに、より良いオプションは配列を読むことです。これにより、他の行に簡単にアクセスできます。
$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS