Bash에서 루프백 파일 설명자를 만드는 방법은 무엇입니까?

Bash에서 루프백 파일 설명자를 만드는 방법은 무엇입니까?

파일 설명자에 데이터를 쓴 다음 나중에 bash에서 다시 읽을 수 있기를 원합니다.

이것은 다음과 같습니다:

# some line to create LOOPBACK_FD
echo foo >${LOOPBACK_FD}
cat <${LOOPBACK_FD}
# foo is printed

변수를 사용하여 명령의 출력을 저장할 수 있다는 것을 알고 있습니다. 예를 들면 다음과 같습니다.

MYMESSAGE=$(echo foo)
echo ${MYMESSAGE}

memfd_create뭔가를 해라좋다내가 원하는 것은, 하지만 파일 오프셋에 문제가 있을 수 있고 bash는 그것을 전혀 사용하지 않는 것 같습니다.

어쩌면 이것을 할 수 있는 특별한 장치가 있을까요?

편집: 파일 시스템에 새 노드를 만들 필요가 없는 솔루션을 찾고 있습니다.

답변1

echo foo >${LOOPBACK_FD}
cat <${LOOPBACK_FD}

LOOPBACK_FD이것은 작동하지 않습니다. 생성 또는 열림 방법이나 파일 시스템을 통해 액세스할 수 있는지 여부에 관계없이 작동하지 않습니다 .

cat종료를 기다리는 호출 스크립트가 cat파이프의 쓰기 끝을 열어 두는 한 결코 오지 않을 EOF를 기다립니다.

무엇가능한간단한 예를 사용하는 것은(그러나 교착 상태 및 사소한 버퍼링 문제가 발생할 수 있음) 모든 것을 삼키려고 시도하지 않고 파이프에서 행을 가져오는 read대신 사용하는 것입니다.cat

편집: 파일 시스템에 새 노드를 만들 필요가 없는 솔루션을 찾고 있습니다.

Linux에는 "익명" 파이프가 없습니다. pipe(2)시스템 호출을 사용하거나 |셸에서 생성된 파이프 라도 /proc/{pid}/fd/{fd}또는 를 통해 액세스 할 수 있습니다 /proc/self/fd/{fd}.~ 할 것이다항상 파일 시스템에 새 노드를 "생성"하십시오.

그러나 해당 함수를 사용하여 입력 파이프의 쓰기 측을 열 수 있으며(또는 그 반대) XY 문제에 대한 "스마트" 답변을 제공할 수 있습니다.

#! /bin/bash
exec {fd}< <(:) {fd}<>/proc/self/fd/$fd

echo eenie >&$fd
read message <&$fd; echo "$message"

echo meenie >&$fd
read message <&$fd; echo "$message"

관련 정보