Замена команды в Сценарии оболочки

Электронная почта была разработана еще в те времена, когда компьютеры не имели постоянного, быстрого сетевого соединения друг с другом, по модели почтовой почты. Когда вы посылаете электронное письмо, оно отправляется на сервер, который посылает его на другой сервер, и так далее, пока письмо не достигнет своего адресата. Самые старые почтовые системы имели локальную доставку , затем были системы, в которых электронная почта должна была указывать список ретрансляторов до места назначения , и в настоящее время электронная почта автоматически маршрутизируется по сетям, где практически все компьютеры могут достигать друг друга большую часть времени. Тем не менее, электронная почта остается почтовой службой, а не службой мгновенных сообщений. Если электронная почта задерживается в пути, например, из-за временного перебоя в работе сети, промежуточный сервер будет держать электронную почту в резерве до тех пор, пока ссылка не будет восстановлена.

В связи с такой конструкцией, электронная почта является асинхронной. Все, что делает команда mailx, это передает электронное сообщение на локальный MTA. Код возврата с mailx, указывающий на успешную передачу, указывает на то, что местный MTA принял задание на доставку сообщения. На этот момент сообщение успешно отправлено . После этого MTA отправляет письмо по назначению. Если MTA не в состоянии выполнить свое обещание по доставке, он должен отправить сообщение bounce пользователю, который отправил сообщение.

Вы не можете знать наверняка, доставлено ли письмо в почтовый ящик получателя, и даже это бесполезно (например, что, если письмо успешно доставлено, то компьютер, на котором хранится почтовый ящик, сгорит при пожаре). Если вам нужно знать, получил ли получатель письмо, единственный верный способ - это включить в него инструкции для подтверждения получения письма. (Существуют способы автоматической отправки квитанции при открытии письма в определенных программах, но они работают только в совместимых программах, и они также ненадежны, например, если компьютер получателя сломался сразу же после открытия письма)

Знание того, доставлено ли письмо, ничего не говорит вам о том, смогли ли другие люди его прочитать. В отличие от физических объектов, электронные сообщения на самом деле не "отклоняются": они копируются, и если вокруг есть дополнительные копии, это не может быть обнаружено. Если электронное сообщение должно быть конфиденциальным, зашифровать его.

0
25.11.2018, 02:51
2 ответа

Ваша строка:

val=$("$line" | wc -c)

Эта пытается выполнить команду, данную $line и пропустить выход через wc -c . Сообщение об ошибке, которое Вы видите, указывает на то, что он пытается выполнить команду "hellounix", как и в первой строке Вашего файла. Если Вы хотите передать значение переменной в команду вместо нее, Вы можете использовать printf:

val=$(printf '%s' "$line" | wc -c)

Если Вы используете Bash, zsh, или другую более мощную оболочку, Вы также можете использовать здесь stringings:

val=$(wc -c <<<"$line")

<< выполняет расширение на строке "$line", а затем предоставляет его в качестве стандартного входа wc -c.


Однако в данном конкретном случае можно использовать встроенное расширение параметра оболочки для получения значения длины переменной вообще без трубопровода:

val=${#line}

Расширение # расширяется до:

Длина строки. Подставляется длина в символах значения параметра. Если параметр '*' или '@', то результат расширения не указывается. Если параметр не задан и установлено -u, то расширение будет неудачным.

1
28.01.2020, 02:52
val=$("$line" | wc -c)

Эта строка означает "назначить вывод команды "$line" | wc -c переменной val". Допустим, $line содержит hellounix, так что теперь это выглядит следующим образом:

val=$(hellounix | wc-c)

Пытается выполнить команду с именем hellounix, которая не найдена, поэтому вы получаете ошибку hellounix: не найдена.

Простым исправлением было бы добавление echo, например:

val=$(echo -n "$line" | wc -c)

Это "эхо" линии к stdout, а затем передача ее в wc. Опция -n удаляет символ новой строки в конце строки, так как wc считает его. Если необходимо считать символ новой строки в конце строки, удалите опцию -n.

С -n:

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 9 Charecter
file1 -->Containd 5 Charecter
Total Line in File : 2

Только с echo:

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 10 Charecter
file1 -->Containd 6 Charecter
Total Line in File : 2
0
28.01.2020, 02:52

Теги

Похожие вопросы