스택오버플로 답변명령 대체가 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 인코딩 등일 수 있습니다 . 이것이 바로 대답입니다. uuencode
NUL 없이 "더 나은" 문자열을 사용하여 파일을 인코딩한 다음 변수에 저장합니다 S
. (일반 형식은 S=$(cat file)
작동하지 않으며 NUL 바이트 등을 사용하여 파일을 있는 그대로 저장하려고 시도합니다.) 파일을 디코딩하는 반대 작업도 표시됩니다.
일반적으로 큰 필요성은 없으며 사람들은 이를 피하려고 노력해야 합니다. 파일을 파일로 유지하고 외부 도구를 사용하여 필요에 따라 처리하면 파일 작업이 더 쉬워집니다. 그러나 문제는 특히 쉘 변수에 파일(모든 파일)을 저장하는 방법에 관한 것입니다. 이론적으로 이것은 어느 정도 유용할 수 있습니다. 아마도.
귀하의 경우 고정 문자열만 인쇄하려는 경우 printf "a\0\n" > $filename
모든 바이트가 이스케이프 문자로 표시될 수 있으므로 이와 유사한 방법이 작동합니다.\NNN