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


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.