이와 같은 외부 명령을 사용하지 않고 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
한 가지 방법은 다음과 같습니다.
$ A=$(<file)
변수 대신에 더 나은 옵션은 배열을 읽는 것입니다. 이를 통해 다른 행에 더 쉽게 액세스할 수 있습니다.
$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS