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/stdin
stdin에서 읽어오는 mutt와 함께 파일 이름을 사용할 수도 있습니다 .
mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]
흠, 방금 이것을 시도했는데 mutt가 불평합니다:
/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.
아 글쎄. 나는 이것이 당신의 질문에 답한다고 생각합니다. -a
mutt 옵션을 사용하면 장치나 파이프가 아닌 일반 파일을 기대합니다.