이전 명령의 stdoutput 앞에 무언가를 추가하는 bash 파이프 구성


25

sendmail을 사용하여 물건을 보내려고하고 oneliner에서하고 싶습니다.

echo "mail content" | sendmail emailataddres.com 

제목없이 보냅니다.

제목 줄은 Mail 내용 앞에 와야하므로 다음 줄을 따라 무언가를 찾고 있습니다.

echo "mail content" | prepend "Subject: All that matters" | sendmail emailataddres.com 

sed와 awk는 사용하고 기억하기가 정말 어색합니다.

편집 : 명확하게 : echo "메일 내용"은 단지 예입니다. 모든 소스의 stdout 스트림 앞에 물건을 추가 할 수 있어야합니다. 예 : ifconfig, zcat 등


echo -e "Subject: All that matters\nmail content"? 또는 더 많은 플랫폼에 구애받지 않습니다 printf 'Subject: %s\n%s\n' "All that matters" "mail content". 작은 문자열을 작성하여 두 개의 문자열 인수를 사용하여 더 간단한 한 줄짜리를 만들 수도 있습니다.
다니엘 앤더슨

글쎄, 당신이 답으로 이것을 추가한다면 나는 그것을 받아들일지도 모른다 ... :)
AndreasT

아, 아니요, 죄송합니다. 내 편집 내용을 고려하십시오.
AndreasT

어떻게해야 prepend합니까? 무언가를 추가하는 방법을 알기 위해서는 업스트림 명령 (예 echo:)이 EOF를 보낼 때까지 기다려야 데이터를 스트림에 먼저 삽입하여 stdout에 전달하여 sendmail로 파이프 할 수 있습니다. 짧은 Ruby 또는 Python 스크립트 작업처럼 들립니다.
allquixotic

1
약간 다른 접근 방식은 직접 mail대신에 명령 (때로는 bsdmail이라고 함) 을 사용하는 것입니다 sendmail. mail선택적 -s subject옵션을 취합니다 . ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

답변:


43
$ echo 1 | (echo 2 && cat)
2
1

더 좋은 해결책이 있다고 확신하지만 이것이해야합니다.


1
간단하고 기능적이며 시연되었습니다. +1
Hennes

휴식 시간없이 쉽게 할 수있는 방법이 있습니까?
VenomFangs

2
@VenomFangs printf두 번째 대신 사용 echo하면 괜찮을 것입니다
Trendfischer

> 휴식 시간없이 쉽게 할 수있는 방법이 있습니까? -echo -n
KYB

6

Claudius의 말을 사용하거나 직접 작성하십시오.

~ / bin / prepend :

#!/bin/sh
echo -en "$@"
cat -

예 :

$ echo "Splendid SUPANINJA! Let's do it!" |\
     prepend "Subject: Venetian Snares\n"

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

이것은 Claudius의 답변에서 영감을 얻었습니다.

출력 사이에 중단 리턴을 원하지 않으면 -n매개 변수를 추가하십시오 . 이것은 다음과 같습니다

$ echo 1 | (echo -n 2 && cat)

어느 것이 줄 것인가?

21


1
실제로는 그렇지 않습니다. "2 \ n1"을 제공합니다. "-n"을 두 번째 에코 에 연결해야합니다 . 여전히 +1입니다. 당신이 그것을 정정하면, 나는 그것을 받아들일지도 모른다. Claudius가 솔루션에 가장 많이 기여했기 때문에 공정한 것이 무엇인지 잘 모르겠습니다.
AndreasT

미안, 내가 -n잘못된 곳에 넣었다고 생각해 어쨌든, 업데이트는 "n \ n"을 주어야합니다. 만약 당신이 \ n을 없애고 싶다면 그냥 -n을 1 앞에 추가하십시오.
VenomFangs

1

내가 수집 한 조각에서 ... 당신은 다음과 같이 할 수 있습니다 :

echo "Subject: All that matters
`echo "mail content"`" | sendmail blah@blahblah

첫 번째 줄에서 따옴표를 닫지 않았습니다 ... 모든 쉘 \n이 줄 바꿈 문자로 변환되지 는 않지만 따옴표 내에서 실제 줄 바꿈을 처리하지 않는 줄을 찾지 못했습니다.

명령이`문자로 묶이면 명령이 실행되고 출력이 제자리에 주입됩니다. 이 코드는 시스템을 쉽게 손상시킬 수있는 추가 명령을 인라인으로 삽입 할 수 있으므로 약간 위험합니다.

**** edit **** Claudius의 조언에 따라 더 깨끗한 옵션은 다음과 같습니다.

echo -e "Subject: All that matters \n $(echo "mail content") |sendmail blah@blahblah

해당 템플릿을 사용하더라도 악용 될 수 있습니다.


1
$()``휴대 성이 뛰어나고 읽기 쉽습니다 .`` 라고 가정하기 때문에 일반적으로 사용하는 것이 좋습니다. 또한 echo-e옵션을 사용하여 개행 ( echo -e "1\n2")을 번역 하거나 첫 번째 주석에서 Daniel이 제안한대로 printf를 사용할 수 있습니다.
Claudius

답변을 게시 한 직후에 ... 나는 당신의 것을 읽고 더 좋아합니다. 좋은 지적입니다.
TheCompWiz

0

프로세스 대체를 사용하여 파이프 출력 앞에 추가 할 수 있습니다 .

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.