if [ who | grep $user | grep pts ]
then
write $user
message here
EOF
fi
Если я его выполню, он блокируется при записи, и мне приходится вводить сообщение вручную, а затем нажимать Ctrl+ d.
Есть ли способ отправить сообщение и EOF через программу?
решение1
Ты можешьперенаправьте ваш ввод из одной программы в другуютак:
echo "message here"|write $user
или так:
cat /tmp/message|write $user
решение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