Синтаксис аргумента функции Clojure

Поскольку бит suid в исполняемых файлах только изменяет эффективный UID (EUID), исполняемый файл будет работать как, а не как реальный UID (RUID), который возвращает getuid(), и в дополнение к ограничению на suid интерпретируется сценарии (любой исполняемый файл, начинающийся с «#!»), некоторые оболочки, например bash, в качестве дополнительной меры безопасности вернут EUID обратно к RUID, в этом случае вам потребуется использовать вызов setuid(0) в коде C перед выполнением сценария.

См. man страницы setuid, seteuid, getuid и geteuid, чтобы узнать точную семантику действительных и эффективных UID.

( ПРЕДУПРЕЖДЕНИЕ ) Конечно, уместно упомянуть, что ограничение на скрипты suid во многих системах Unix, оболочках и интерпретаторах существует по причине, которая заключается в том, что если Скрипт не очень осторожен в отношении очистки входных данных и состояния среды, когда он выполняется, они опасны и могут быть использованы для повышения безопасности. Так что будьте очень осторожны при этом. Установите доступ к вашему сценарию и оболочке как можно более строго, разрешите только этот очень специфический сценарий, который вы собираетесь выполнять, и очистите среду в вашей программе на C перед запуском сценария, установив переменные среды, такие как PATH, чтобы они содержали именно то, что необходимо в правильном порядке и нет каталогов, которые могут быть записаны для других.

6
задан Pedro Estrada 23 October 2009 в 18:08
поделиться

2 ответа

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

 refers to all public vars of ns, subject to filters.
 filters can include at most one each of:

 :exclude list-of-symbols
 :only list-of-symbols
 :rename map-of-fromsymbol-tosymbol

Она написана таким образом, что вы можете указать более одного символа, если хотите.

(use '[clojure.contrib.duck-streams :only (reader writer)])

Как обсуждалось в ] этот недавний пост , если вы пишете функцию, которая принимает или возвращает переменное количество аргументов, неплохо, чтобы она всегда принимала / возвращала список, вектор или набор, даже если она принимает / возвращает единичный предмет. Потому что:

  • nil , часто используемый для обозначения «нулевых элементов», поддерживает seq . Пустые коллекции также поддерживают seq .
  • Два или более элемента в списке поддерживают seq .
  • Имеет смысл иметь только один элемент, который можно seq поместить в сам список.

Было бы неудобно, если бы случай с одним элементом был особым случаем. Более согласованно и проще программировать, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список.

Обратите внимание, что все использование заботится о том, является ли аргумент : only последовательным набором символов. Это означает, что списки, векторы и наборы работают.

(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])

Один символ , однако, не поддерживает seq , поэтому вы получаете исключение, которое делаете.

Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.

Более последовательный и простой в программировании, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список.

Обратите внимание, что все использование заботится о том, является ли аргумент : only последовательным набором символов. Это означает, что списки, векторы и наборы работают.

(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])

Один символ , однако, не поддерживает seq , поэтому вы получаете исключение, которое делаете.

Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.

Более последовательный и простой в программировании, когда вы рассматриваете один элемент как своего рода вырожденный случай и добавляете его в список.

Обратите внимание, что все использование заботится о том, является ли аргумент : only последовательным набором символов. Это означает, что списки, векторы и наборы работают.

(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])

Один символ , однако, не поддерживает seq , поэтому вы получаете исключение, которое делаете.

Посмотрите ] core.clj , если вы хотите увидеть, как все это реализовано.

14
ответ дан 8 December 2019 в 16:05
поделиться

Those aren't just "parens" — parens are the syntax for creating a list. It would appear the item after the :only tag is expected to be a list of things it applies to.

1
ответ дан 8 December 2019 в 16:05
поделиться
Другие вопросы по тегам:

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