Есть ли что-то как закрытия для zsh?

Я рекомендовал бы установить сценарий 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

7
09.10.2013, 04:32
4 ответа

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, это загружает определение из диска.

10
27.01.2020, 20:15
  • 1
    Это - то, что я искал. Я еще не могу-голосовать, но престижность. –  ferhtgoldaraz 08.10.2013, 23:04
  • 2
    @Matt, дополнительный кредит на упоминание add-zsh-hook. –  SuperMagic 08.10.2013, 23:09

Нет, закрытия слишком сложны для zsh. Zsh разработан для интерпретации маленьких сценариев, которые далеко не удалены из прямого взаимодействия. Это не имеет необычных функций языка, которые очень полезны для программирования в большом, но меньше для вида небольших задач, для которых обычно используются оболочки.

Обратите внимание, что, если была некоторая форма закрытия, которое позволило значению переменных быть предварительно вычисленным раз и навсегда и затем сохраненным, значения не будут обновлены, когда что-то изменится, который заставляет информацию становиться недопустимой.

$git_info и полученные переменные могут измениться в любое время из-за модификации в файл, зарегистрировался в мерзавце или в репозиторий мерзавца. Таким образом, они должны быть повторно вычислены каждый раз так или иначе.

Вы могли кэшировать значения cwd и who_where в глобальной переменной, так как они не изменяются при нормальном функционировании. cwd изменения, когда текущий каталог изменяет так его, должны были бы быть обновлены от chpwd. Однако эти переменные чрезвычайно быстры для вычислений, таким образом, нет никакого смысла в беспокойстве. Дорогое вычисление здесь работает git_prompt_info, и это может измениться в любое время.

При отображении информации между каждой командой это может быть лучшая идея поместить его как часть подсказки (PS1 или psvar массив). Zsh знает, что должен вновь отобразить подсказку во множестве обстоятельств, тогда как он ничего не знает о том, от чего Вы печатаете precmd.

5
27.01.2020, 20:15
  • 1
    +1 для обращения к потребности повторно вычислить значения каждый раз. –  chepner 17.10.2013, 19:49

Да, те переменные (ре), определил каждый раз, когда Вы вызываете функцию.

Если Вы хотите инициализировать их только однажды, Вы могли бы просто переместить их в верхний уровень из функции.

1
27.01.2020, 20:15
  • 1
    спасибо за ответ. Хотя я пытаюсь найти альтернативы использованию глобальной области видимости, таким образом, я могу бороться, это - загрязнение в будущем, если потребность возникает. Возможно, существует некоторая альтернатива этому? –  ferhtgoldaraz 08.10.2013, 20:14
  • 2
    Едва ли. Можно использовать префикс на переменных, сказать LRPROMPT _, для ограничения возможных коллизий/загрязнения имени...., но это все еще возможно. Кроме того, это - просто Ваша оболочка и подсказка. Коллизии могут произойти, но дело не в этом большой соглашение, если Вы не делаете вполне немного больше в оболочке, чем, вероятно, разумно. Я использую oh-my-zsh И имею больше чем 2 000 строк в пользовательской zsh конфигурации (вне omz), и коллизии действительно не являются проблемой. Я действительно использую префиксы, все же. –  SuperMagic 08.10.2013, 20:20
  • 3
    Если Ваши файлы запуска оболочки являются настолько большими, что коллизии имени являются действительно проблемой, Вы почти наверняка собираетесь иметь другой, более серьезные проблемы также :) –  Ben 08.10.2013, 20:30
  • 4
    @Ben, то число включает функции, которые имеют значительный пробел и локальные переменные. Если бы у меня было 2 000 глобальных псевдонимов и переменных...., которые были бы проблемой. –  SuperMagic 08.10.2013, 20:54

Чтобы иметь замыкания, язык должен иметь возможность манипулировать функциями как элементами или объектами, что невозможно в 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))) }"
}
0
25.06.2020, 10:55

Теги

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