두 가지 중요한 함정
지금까지 다른 답변에서 무시되었습니다.
- 명령 확장에서 후행 줄 바꿈 제거
- 널 문자 제거
명령 확장에서 후행 줄 바꿈 제거
이것은 다음에 대한 문제입니다.
value="$(cat config.txt)"
read
기반 솔루션 에는 적합하지 않습니다 .
명령 확장은 후행 줄 바꿈을 제거합니다.
S="$(printf "a\n")"
printf "$S" | od -tx1
출력 :
0000000 61
0000001
이것은 파일에서 읽는 순진한 방법을 깨뜨립니다.
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"
POSIX 해결 방법 : 명령 확장에 추가 문자를 추가하고 나중에 제거하십시오.
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
출력 :
0000000 61 0a 0a
0000003
거의 POSIX 해결 방법 : ASCII 인코딩. 아래를 참조하십시오.
널 문자 제거
NUL 문자를 변수에 저장하는 깔끔한 Bash 방법은 없습니다 .
이는 확장과 read
솔루션 모두에 영향을 미치며 이에 대한 좋은 해결 방법을 모릅니다.
예:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
출력 :
0000000 61 00 62
0000003
0000000 61 62
0000002
하, 우리의 NUL이 사라졌습니다!
해결 방법 :
함정에 대한 해결 방법
uuencode base64로 인코딩 된 파일 버전을 변수에 저장하고 매번 사용하기 전에 디코딩하십시오.
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"
산출:
0000000 61 00 0a
0000003
uuencode와 udecode는 POSIX 7 이지만 기본적으로 Ubuntu 12.04에는 없습니다 ( sharutils
패키지) ... <()
다른 파일에 쓰는 것을 제외하고 bash 프로세스 대체 확장에 대한 POSIX 7 대안이 보이지 않습니다 ...
물론 이것은 느리고 불편하기 때문에 실제 대답은 다음과 같습니다. 입력 파일에 NUL 문자가 포함될 수 있으면 Bash를 사용하지 마십시오.
cat
또는$(<someFile)
(크기가 실제 파일보다 작) 불완전한 결과가 유도된다.