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


36

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

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

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


1
bash 대신 sh를 사용하고 있음을 알기 전까지는 <()을 사용할 수 없었습니다. 잘 작동합니다. (필요한 경우) 필요한 최소 평판에 도달하면 유용한 답변을지지합니다. 모든 답변에 감사드립니다.
Pierre

답변:


53

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

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

2
대박! 처음으로 그러한 방향 전환을보고 있습니다.
Saurabh Barjatiya

좋은 설명 감사합니다! I / O 리디렉션에 대한 자습서에서는 이전에 본 적이 없습니다.
Christian Mann

4

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

1

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

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


1

/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 옵션을 사용하면 장치 또는 파이프를 의미하지 않는 일반 파일을 기대하면서 이것이 귀하의 질문에 대답한다고 생각합니다 .


1

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


0

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

mysqldump mysqldumpoptions | sendmail admin@example.org

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

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


1
그런 다음 첨부 파일이 아니므로 수신자에게 사용하기 어려울 것 같습니다.
freiheit

1
이 경우 더 나은 해결책은 metamail (1) 또는 mime-construct (1p)와 같은 도구를 사용하거나 perl MIME :: Lite 모듈과 같은 것을 사용하여 직접 작성하는 것입니다. 가장 일반적인 MIME 관련 항목).
cas

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.