비표준 파일 설명자를 사용하여 매핑된 파일을 통해 파일을 배열로 읽는 방법은 무엇입니까?

비표준 파일 설명자를 사용하여 매핑된 파일을 통해 파일을 배열로 읽는 방법은 무엇입니까?

mapfile -t -u 7 arr < textfilebash: mapfile: 7: invalid file descriptor: Bad file descriptor 그러한 설명자를 허용하는 파일을 한 줄씩 읽는 더 자세한 방법을 알려주십시오 .

read_w_while() {
while IFS="" read -u 7 -r l || [[ -n "${l}" ]]; do
  echo "${l}"
done 7< textfile

표준 설명자는 0광범위하게 사용됩니다. 그러한 설명자를 사용하면 스크립팅이 간섭으로부터 더 안전해 집니까? 내 경험에 따르면 나는 while IFS="" read -u 7 ...지금까지 이러한 간섭을 목격했으며 설명자를 사용할 때 Ubuntu 데스크톱 사용자입니다 7. 이 간섭의 원인은 무엇일까요?

답변1

mapfile -t -u 7 arr < textfile나에게주세요.
bash: mapfile: 7: invalid file descriptor: Bad file descriptor

예, fd 7이 열려 있지 않으면 가능합니다.-u 7 오직fd 7에서 읽으라는 지시가 있지만 해당 fd가 어떻게 또는 어디에 있어야 하는지는 알려주지 않습니다.

두 번째 코드 조각에는 fd 7에서 파일을 여는 입력 리디렉션이 있으므로 7< textfilefd 7에서 파일을 읽는 것이 자연스러워야 합니다.

read원시 표준 입력을 동시에 사용해야 하는 경우 일반적으로 다른 파일 설명자가 사용됩니다. 예를 들어 while read ...루프를 사용하여 파일에서 데이터를 읽지만 터미널(표준 입력)에서 읽은 내용을 루프 내에서 실행하는 경우도 있습니다.

이제 엄밀히 말하면 이 -u fd옵션은 eg 를 사용하여 동등한 기능을 얻을 수 있기 때문에 필요하지 않습니다 read ... 0<&7. 그러나 이는 파일 설명자를 올바른 위치에 배열하기 위해 쉘이 약간의 저글링을 수행해야 한다는 단점이 있습니다.

  • 먼저 fd 0을 안전한 보관을 위해 다른 번호(예: fd 9)에 복사합니다.
  • fd 7을 fd 0에 복사(이전 fd 0 닫기)
  • 실행 read, fd 0에서 읽기
  • fd 9에서 원본 fd 0 복사(현재 fd 0 닫기)
  • fd 9에서 이제 불필요한 복사본을 닫습니다.

이 모든 것뿐만 아니라

  • 실행 read -u 7, fd 7에서 읽기

(원래 명시적인 단계로 "close fd 0"을 썼지만 그러면 dup2()대상 fd가 자동으로 닫힙니다.)

답변2

-u 7댓글에서 지적했듯이 < textfile일치하는 항목이 없습니다. 작동하려면 리디렉션을 생략 -u 7하거나 두 번째 예의 리디렉션으로 변경해야 합니다 . 7< textfile파일 설명자 7이 아직 열리지 않았기 때문에 오류가 발생합니다.

보안 문제에 관해서는 파일 설명자 7을 사용하면 어떤 식으로든 보안이 어떻게 변경되는지 모르겠습니다. 이와 같은 다른 파일 설명자를 사용하는 유일한 이유는 해당 파이프라인의 다른 용도를 위해 기존 표준 입력을 보존하려는 경우입니다. 이는 단일 명령(맵 파일)이고 복잡한 파이프라인이 아니기 때문에 의미가 없습니다.

관련 정보