コマンド置換がNULと末尾の改行を削除するのを防ぐ方法は?

コマンド置換がNULと末尾の改行を削除するのを防ぐ方法は?

スタックオーバーフローで回答コマンド置換がNULと末尾の改行文字を削除し、それを防ぐために次のコマンドを提供することを示します。

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"

cat "$FILE"NUL または末尾の改行は削除されません。交換できますか?

S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") 

したがって、提案されたコマンドは次のように単純化できます。

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
cat "$FILE" | od -tx1
rm "$FILE"

答え1

リンクされた質問に関する重要な点はタイトルです:「ファイルを読む方法変数として殻に? 「答えは「いいえ」です。BashはNULバイトを処理できないからです。

これは、リテラルNULが異なるように表示されるようにファイルをエンコードすることで解決できます。これはBase64エンコーディング(uuencode -m以前と同様)でもURLエンコードなどでもかまいません。これがまさに答えです。uuencodeNULなしで「より良い」文字列を使用してファイルをエンコードし、変数に保存しますS。 (通常の形式はS=$(cat file)機能せず、NULバイトなどを使用してファイルをそのまま保存しようとします。)ファイルをデコードする反対のタスクも表示されます。

一般的に大きな必要性はなく、人々はこれを避けようとしなければなりません。ファイルをファイルとして保存し、外部ツールを使用して必要に応じて処理すると、ファイル操作が簡単になります。しかし、問題は、特にシェル変数にファイル(すべてのファイル)を保存する方法です。理論的にはこれはある程度役に立ちます。おそらく。


あなたの場合、固定文字列のみを印刷したい場合は、printf "a\0\n" > $filenameすべてのバイトがエスケープ文字で表示される可能性があるため、同様の方法が機能します。\NNN

関連情報