Как отправить письмо / написать другому пользователю через скрипт оболочки? Как отправить EOF?

if [ who | grep $user | grep pts ]
then
              write $user
                   message here
                   EOF
fi

Здесь, если я выполню его, он блокируется при записи, и мне нужно ввести сообщение вручную, а затем нажать Ctrl+d.

Есть ли способ отправить сообщение и EOF через программу?

2 ответа

Решение

То, что вы, вероятно, ищете, это следующий стиль написания (эквивалентно другим методам)

write $user <<EOF
    message here
    as opposed to the
       echo "asd" | write $user
    method, using here-doc redirection transparently allows multiple lines
    and reads everything until seeing the delimiter
    so the sent message end here:
EOF

Примечание: здесь вы напрямую не "отправляете EOF", оболочка просто воспринимает слово "EOF" как выбранную вами отметку окончания ввода и заканчивает ввод там - и команда write не просит вас нажать Ctrl+ D в этом случае потому что он читает из того, что оболочка ему подает.

Примечание 2: вам может пригодиться знание того, что практически все инструменты командной строки в мире Unix допускают подобные хитрости оболочки по умолчанию, поскольку они полагаются только на невероятно универсальную концепцию stdin - write, как и многие другие инструменты, читать из того, что ему передано, и только интерактивно запрашивать ввод данных, если их нет, а метод ввода пользователя имеет смысл.

Для получения дополнительной информации, есть вопрос, спрашивающий именно об этом здесь: https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash

Вы можете передавать свои данные из одной программы в другую следующим образом:

echo "message here"|write $user

или вот так:

cat /tmp/message|write $user
Другие вопросы по тегам