전체 파일을 메모리로 읽어 들이시겠습니까?

전체 파일을 메모리로 읽어 들이시겠습니까?

이와 같은 외부 명령을 사용하지 않고 bash에서 전체 파일을 메모리로 읽는 방법이 있습니까 cat?

파일에서 출력을 가져오는 구문(예: )을 알고 있지만 <(/bin/ls)이제 파일을 전체 메모리로 읽어야 합니다. 즉, $A내용을 저장해야 합니다(null, EOF 등이 있을 수 있음).

답변1

Bash는 변수에서 null 바이트를 지원하지 않습니다. 첫 번째 널 바이트까지 파일의 시작 부분을 포함 foo=$(cat file)시킵니다 . $foo명령 대체는 파일에서 마지막 줄 바꿈도 제거합니다. 예를 들어, 파일이 4바이트( anewline, 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

관련 정보