Я рекомендовал бы установить сценарий Python для отправки электронного письма, они очень легки записать и настроить корректные почтовые серверы для любого сервиса, который Вы используете. Они выглядят примерно так:
#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Используйте это в сочетании с оператором канала, предложенным в других ответах.
Другое отличное решение, которое я нашел к этой проблеме, использует Слабого соперника. Слабый соперник - "Слабый соперник помогает отправить уведомления в реальном времени Вашему Android и устройствам на iOS". Я устанавливаю простой сценарий, какой ultised легкий API для отправки сообщения в мой телефон, когда мои сборки сделаны.
curl -s \
-F "token=APP_TOKEN" \
-F "user=USER_KEY" \
-F "message=The build is done." \
https://api.pushover.net/1/messages.json
Zsh не имеет ничего как закрытия или пакеты или пространства имен. Zsh испытывает недостаток в наборе вещей, требуемых иметь истинные закрытия:
Функции не являются первым классом. Вы не можете раздать функции как аргументы другим функциям, и функции не могут возвратить другие функции. (Можно передать название функции для вызова, но это не то же как передача самой функции).
У Вас не может быть вложенных функций. Все функции в zsh глобальны. Необходимо снабдить префиксом имена функций для предотвращения конфликтов. Обратите внимание особенно, что функции будут теневые внешние программы с тем же именем. Если Вам назвали функцию ls
, это назовут вместо программы ls
. Это может быть полезно, кроме того, если Вы делаете это случайно.
Переменные динамично ограничены по объему, не статически ограничены по объему как на наиболее современных языках. Даже если бы у Вас могли бы быть вложенные функции, внутренние функции не закрылись бы по локальным переменным внешних функций в способе, которым Вы будете обычно ожидать. Вы не могли использовать их для создания модулей путем, люди выполняют, скажем, в JavaScript.
Zsh действительно имеет анонимные функции, но без любой из этих других вещей они не полезны для очень.
Так в основном лучшее, которое можно сделать, должно снабдить префиксом все функции и глобальные переменные.
Я также укажу, что необходимо сделать, определяют Ваш precmd
как это:
% autoload -Uz add-zsh-hook
% add-zsh-hook precmd my_precmd_function
add-zsh-hook
позволяет Вам сцепить свою функцию в precmd
без него перезаписывающий любые другие функции, которые могли бы также хотеть сцепиться precmd
.
То, что это означает иметь загруженную функцию, является отдельным вопросом. Zsh имеет функцию с автозагрузкой, которая только загружает функции из диска, когда их на самом деле называют. Когда Вы делаете autoload -Uz foobar
, это делает функцию названной foobar
доступный вызову. Когда Вы на самом деле звоните foobar
, это загружает определение из диска.
Нет, закрытия слишком сложны для zsh. Zsh разработан для интерпретации маленьких сценариев, которые далеко не удалены из прямого взаимодействия. Это не имеет необычных функций языка, которые очень полезны для программирования в большом, но меньше для вида небольших задач, для которых обычно используются оболочки.
Обратите внимание, что, если была некоторая форма закрытия, которое позволило значению переменных быть предварительно вычисленным раз и навсегда и затем сохраненным, значения не будут обновлены, когда что-то изменится, который заставляет информацию становиться недопустимой.
$git_info
и полученные переменные могут измениться в любое время из-за модификации в файл, зарегистрировался в мерзавце или в репозиторий мерзавца. Таким образом, они должны быть повторно вычислены каждый раз так или иначе.
Вы могли кэшировать значения cwd
и who_where
в глобальной переменной, так как они не изменяются при нормальном функционировании. cwd
изменения, когда текущий каталог изменяет так его, должны были бы быть обновлены от chpwd
. Однако эти переменные чрезвычайно быстры для вычислений, таким образом, нет никакого смысла в беспокойстве. Дорогое вычисление здесь работает git_prompt_info
, и это может измениться в любое время.
При отображении информации между каждой командой это может быть лучшая идея поместить его как часть подсказки (PS1
или psvar
массив). Zsh знает, что должен вновь отобразить подсказку во множестве обстоятельств, тогда как он ничего не знает о том, от чего Вы печатаете precmd
.
Да, те переменные (ре), определил каждый раз, когда Вы вызываете функцию.
Если Вы хотите инициализировать их только однажды, Вы могли бы просто переместить их в верхний уровень из функции.
Чтобы иметь замыкания, язык должен иметь возможность манипулировать функциями как элементами или объектами, что невозможно в zsh, кроме как через строки и eval
встроенную (как и в других оболочках ). Но это очень ограничено, так как вам нужно обрабатывать все вещи низкого -уровня самостоятельно (, например. цитируя ). Однако, когда аргументы не имеют специальных символов (, поэтому не нужно обрабатывать кавычки ), легко можно делать некоторые простые вещи, используя эту идею, и в zsh анонимные функции могут немного помочь. Например, для определения функций, которые вычисляют a*x+b*y
, где a
и b
— константы, заданные при определении функции, а x
и y
— аргументы функции:
mk_ax_plus_by() { echo "() { echo \$((($1)*(\$1)+($2)*(\$2))) }" }
fct_2x_plus_3y=$(mk_ax_plus_by 2 3)
fct_5x_plus_7y=$(mk_ax_plus_by 5 7)
Итак, есть функция fct_2x_plus_3y
, которая вычисляет 2*x+3*y
, и функция fct_5x_plus_7y
, которая вычисляет5*x+7*y
(обратите внимание, что я выбрал имена функций только для удобства чтения, это могут быть любые имена, и вы делаете даже не нужно хранить содержимое в переменных ). Также обратите внимание, что на самом деле это строки (, а не функции в терминологии оболочки ), но они будут вести себя как функции со встроенным eval
. Пример использования:
% eval $fct_2x_plus_3y 4 9
35
% eval $fct_5x_plus_7y 4 9
83
поскольку 2*4+3*9
дает 35, а 5*4+7*9
дает 83.
Обратите внимание, что, в отличие от функциональных языков, здесь необходимо различать параметры, поступающие из среды (без кавычек )и параметры определенной функции (, заключенные в кавычки ), т.е. вызов функции. Но можно изменить реализацию, чтобы она больше походила на функциональные языки, и использование будет таким же :
.mk_ax_plus_by()
{
local x='$1' y='$2'
echo "() { echo \$((($1)*($x)+($2)*($y))) }"
}