конструкція баш-труби, щоб щось додати до виводу попередньої команди


25

Я хочу використовувати sendmail, щоб надсилати мені речі, і хочу це робити в онлайні.

echo "mail content" | sendmail emailataddres.com 

Надсилає його без теми.

Тема повинна надходити до вмісту пошти, тому я шукаю щось у порядку:

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

sed і awk, як правило, незручно використовувати і запам'ятовувати.

EDIT : Просто для уточнення: відлуння "Вміст пошти" - лише наочний приклад. Мені потрібно вміти додавати матеріали до потоків 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.
всекіксотичні

1
Трохи іншим підходом було б використання mailкоманди (іноді її називають bsdmail), а не sendmailбезпосередньо. mailприймає необов'язковий -s subjectваріант, наприклад: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Вім Льюїс

Відповіді:


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

Я майже впевнений, що є приємніше рішення, але це має зробити.


1
Простий, функціональний і продемонстрований. +1
Геннес

Чи є простий спосіб зробити це без повернення перерви?
VenomFangs

2
@VenomFangs Використовуйте printfзамість другого, echoі вам повинно бути добре
Trendfischer

> Чи є простий спосіб зробити це без повернення перерви? -echo -n
киб

6

Або скористайтеся тим, що сказав Клавдій, або зробіть своє:

~ / 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

На це надихає відповідь Клавдій.

Якщо ви не хочете повернути перерву між результатами, додайте -nпараметр. Це буде виглядати так:

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

Що дасть:

21


1
Насправді, ні, це не буде. Це дає "2 \ n1". Ви повинні прикріпити "-n" до другого відлуння. Ще +1. Якщо ви виправте це, я можу це прийняти. Я не впевнений, що справедливо, адже Клавдій найбільше сприяв вирішенню.
AndreasT

Вибачте, думаю, що я поставив його не -nв тому місці. У будь-якому випадку, оновлення повинно дати "21 \ n", якщо ви хочете позбутися \ n, тоді просто додайте -n до 1.
VenomFangs

1

З творів, які я зібрав ... ти можеш зробити щось подібне:

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

Зверніть увагу, що я не закривав лапки в першому рядку ... тому що не всі оболонки переводять \nсимвол у новий рядок ... але мені ще належить знайти той, який не буде обробляти фактичну нову рядок всередині лапок.

Коли команда додається до символу `, вона буде виконуватися і результат буде введений на місце. Майте на увазі, що цей біт коду є трохи небезпечним, оскільки можна вводити додаткові команди, вбудовані, які можуть легко скомпрометувати вашу систему ...

**** редагувати **** Після поради Клавдія, більш чистий варіант виглядатиме так:

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

Навіть за допомогою цього шаблону його можна було б використати.


1
Зазвичай це приємніше використовувати, $()а не `` так як воно повинно бути більш портативним (а також більш читабельним). Крім того, ви можете використовувати echo«s -eможливість зробити переклад нового рядка ( echo -e "1\n2") або просто використовувати Printf як запропонував Данилу в першому коментарі.
Клавдій

Відразу після публікації моєї відповіді ... Я читаю твою і подобається це краще. Хороші бали.
TheCompWiz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.