Я тестирую сценарий для написания заранее определенного сообщения другому пользователю. Начинаю с попытки писать себе (два входа на одну машину). Сценарий зависает без доставки сообщения, пока я не завершу вручную нажатием ctrl + c на отправляющем входе в систему, после чего принимающий логин показывает только то, что я отправил EOF. Сценарий следующий:

#!/bin/bash
write myName
message
!kill $$

Даже когда я раскомментирую команду kill, похоже, что команда записи не видит следующего сообщения. Когда я теряю отправителя с помощью ctrl + c, я вижу следующее ....

[....]$ ./writeScript.sh
write: myName is logged in more than once; writing to pts/112    (hangs here)
^C./writeScript.sh: line 3: message: command not found
Terminated
[...]$

И ресивер видит ...

Message from myName@myPlace on pts/143 at 09:53 ...
EOF

Как мне сделать так, чтобы это сообщение было успешно отправлено? Спасибо.

0
avikarto 6 Июл 2017 в 18:49

1 ответ

Лучший ответ

Вам нужно дать ввод, чтобы написать. Что-то вроде:

#!/bin/bash
write myName << EOM
message
EOM

Или же:

echo message | write myName
3
William Pursell 6 Июл 2017 в 19:56
Второе предложение работает, а первое - нет. Как я могу изменить команду конвейера для отправки нескольких отдельных строк? Я пробовал «echo m1 | echo m2 | write myName», и отправляется только второе сообщение (вероятно, потому, что echo пытается передать по конвейеру эхо, что просто глупо).
 – 
avikarto
6 Июл 2017 в 20:14
1
Heredoc (первый пример) должен работать, и это лучший способ отправить многострочный текст. Однако вы также можете сделать echo "text\nover\nmultiple\nlines" | write myName (просто заключите несколько строк в кавычки.)
 – 
William Pursell
6 Июл 2017 в 20:21
Чтобы использовать несколько эхо, выполните: { echo m1; echo m2; echo m3; } | write myName
 – 
William Pursell
6 Июл 2017 в 20:23
Обратите внимание, что в предыдущем комментарии я не предлагаю встраивать буквальную строку \n в строку, передаваемую в echo. Скорее, я помечу буквальные символы новой строки в комментарии с помощью \n, чтобы, если бы вы вводили пример в интерактивном сеансе, вы бы набрали echo "text<hit return>over....
 – 
William Pursell
9 Июл 2019 в 18:53