bash 명령 출력에서 ​​’가상 파일’을 만드시겠습니까? ​​’가상 파일’을

bash 출력에서 ​​’가상 파일’을 만드는 방법이 있는지 궁금합니다.

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

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org

그러나 mysqldump대신 출력을 Mutt으로 직접 리디렉션합니다 . Mutt의 -a옵션은 스트림이 아닌 파일 만 받아들이지 만 가상 파일 디스크립터 나 그 라인을 따라 전달할 수있는 방법이있을 수 있습니다. 다음과 같은 것 :

mutt -a $(mysqldump mysqldumpoptions) admin@example.org

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

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



답변

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

mutt admin@example.org -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" admin@example.org


답변

나는 당신이 찾고있는 것을 사용하는 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


답변

첨부 파일이어야합니까? 메시지 본문으로 나타날 수있는 경우 (7 비트 클린 ASCII, 줄 자체에 ‘.’가 포함되지 않음 등) 다음과 같이 작동합니다.

mysqldump mysqldumpoptions | mutt -s “오늘의 mysql 덤프”admin@example.org


답변

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

mysqldump mysqldumpoptions | mutt -a /dev/stdin admin@example.org

흠, 나는 이것을 시도하고 mutt 불평합니다.

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

오 잘 나는 이것이 -amutt 옵션을 사용하면 장치 또는 파이프를 의미하지 않는 일반 파일을 기대하면서 이것이 귀하의 질문에 대답한다고 생각합니다 .


답변

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


답변

나는 여기에 뭔가 빠져있을 수 있지만 왜 / usr / sbin / sendmail (또는 배포판에있는 곳)에 대한 직업처럼 들릴 때 mutt를 사용합니까?

mysqldump mysqldumpoptions | sendmail admin@example.org

대부분의 유닉스 MTA는 / usr / sbin / sendmail 명령을 제공하며, 모두 동일한 옵션을 이해하고 거의 동일한 방식으로 작동합니다. 거의 모든 경우에, 사용중인 sendmail의 특정 MTA / 구현을 신경 쓸 필요가 없습니다.

mail / mailx를 포함한 다른 대안들도 있습니다


답변

Mutt -a 옵션은 특히 /etc/mime.types에 정의 된 MIME 유형을 사용합니다. 당신이 생각하는 가상 파일 유형은 실제로 유효한 MIME 유형으로 등록되어 있지 않으므로 mutt 첨부 파일이 작동한다고 생각하지 않습니다. 개념 증명을 위해, mime-support 패키지 (see, edit 등의 mime 파일 액세스 바이너리를 제공함)를 설치하고 가상 파일 (파이프 등)에 대해 see를 실행할 수 있습니다. 인식하지 못합니다. 근본적인 문제는 일반적으로 가상 파일이 디스크가 아닌 메모리에 데이터 내용을 저장한다는 것입니다. 파일 객체는 단지 포인터입니다. tar / gz로 가상 파일을 감싸고 행복하게 만들 수도 있지만 다른 쪽 끝에서 유용한 것을 얻지 못할 것입니다 … 🙂