bash 명령 출력에서 ​​'가상 파일'을 생성하시겠습니까?

bash 명령 출력에서 ​​'가상 파일'을 생성하시겠습니까?

bash 출력에서 ​​'가상 파일'을 생성하는 방법이 있는지 궁금합니다.

mysqldump예: 출력을 외부 이메일 주소에 첨부하여 이메일로 보내고 싶다고 가정해 보겠습니다 . Mutt를 사용하면 그렇게 할 수 있습니다. mutt제가 사용해야 할 옵션은 입니다 -a <name of the file I want to attach>. 임시 파일을 사용할 수 있다는 것을 알고 있습니다.

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile [email protected]

mysqldump하지만 대신 출력을 Mutt로 직접 리디렉션하고 싶습니다 . Mutt의 -a옵션은 스트림이 아닌 파일만 허용하지만 일종의 가상 파일 설명자나 해당 라인을 따라 전달하는 방법이 있을 수 있습니다. 다음과 같은 것 :

mutt -a $(mysqldump mysqldumpoptions) [email protected]

가능합니까? 그렇지 않다면 왜 그렇습니까?

이것은 어리석은 예일 수도 있고 더 쉬운 방법이 있을 수도 있지만 다른 명령의 출력에서 ​​가상 파일을 생성하는 것에 대한 내 질문을 설명하기를 바랍니다.

답변1

이것은 원하는 것을 수행하는 가장 깨끗한 방법입니다.

mutt [email protected] -a <(mysqldump mysqldumpoptions)

운영자는 <()귀하가 요청한 것입니다. FIFO(또는 /dev/fd)를 생성하고 프로세스를 포크하고 stdout을 FIFO에 연결합니다. >()대신 stdin을 FIFO에 연결한다는 점을 제외하면 동일합니다. 즉, 이 프로그램은 뒤에서 당신을 위해 모든 mknod 작업을 수행합니다. 또는 최신 OS에서는 훨씬 더 나은 방식으로 수행합니다.

물론, mutt에서는 작동하지 않습니다.

/dev/fd/63: unable to attach file.

내 생각에 문제는 mutt가 파일에서 검색을 시도하고 있는데 어떤 종류의 파이프에서도 검색할 수 없다는 것입니다. 탐색은 아마도 파일을 스캔하여 MIME 유형이 무엇인지, 어떤 인코딩이 작동할지(예: 파일이 7비트인지 8비트인지) 파악한 다음 파일의 시작 부분을 찾아 실제로 메시지에 인코딩하는 것과 같습니다. .

보내려는 내용이 일반 텍스트인 경우 언제든지 다음과 같이 하여 이를 이메일의 주요 내용으로 만들 수 있습니다(이상적이지는 않지만 실제로 작동합니다).

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" [email protected]

답변2

나는 당신이 찾고있는 것이 fifo를 사용하는 것이라고 생각합니다mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

읽기 프로세스가 없으면 쓰기 프로세스가 차단됩니다.

예를 들어

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

답변3

FIFO가 아마도 가장 좋은 방법일 것입니다. 그러나 mkfifo /path/to/fifo대신 사용할 수 있습니다

답변4

/dev/stdinstdin에서 읽어오는 mutt와 함께 파일 이름을 사용할 수도 있습니다 .

mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]

흠, 방금 이것을 시도했는데 mutt가 불평합니다:

/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.

아 글쎄. 나는 이것이 당신의 질문에 답한다고 생각합니다. -amutt 옵션을 사용하면 장치나 파이프가 아닌 일반 파일을 기대합니다.

관련 정보