local
встроенное, не ключевое слово, таким образом, local files=(…)
не анализируется как присваивание массива, но как строковое присвоение. Запишите присвоение отдельно из объявления. (Уже найденный llua, но примечанием, которое необходимо инициализировать files
к пустому массиву или объявляют переменную с typeset -a
, иначе массив запускается с побочного пустого элемента.)${files[0]}
должен быть записан $files[1]
. С другой стороны, скажите zsh вести себя способом, что это более совместимо с ksh и ударом: поместить emulate -L ksh
в начале функции.emulate
маршрут, Ваш _notes
функция распечатает zsh: no matches found: foo*
если нет никакого завершения для foo
, потому что значением по умолчанию, несоответствующим шарикам, инициировали ошибку. Добавьте спецификатор шарика N
получить пустой массив, если там не идет ни в какое сравнение и тестируют, пуст ли массив._notes
функция, которая влияет на примечания в подкаталогах: необходимо снять префикс до завершения, так, чтобы если, например. ~/notes/foo/bar
существует и Вы вводите n b
, COMPREPLY
набор должен содержать b
, нет foo/b
.Если Вы хотите сохранить файл, это читаемо и ударом и zsh:
type emulate >/dev/null 2>/dev/null || alias emulate=true
function n() {
emulate -L ksh
local arg; typeset -a files
for arg; do files+=( ~/".notes/$arg" ); done
${EDITOR:-vi} "${files[@]}"
}
function nls() {
tree -CR --noreport $HOME/.notes | awk '{
if (NF==1) print $1;
else if (NF==2) print $2;
else if (NF==3) printf " %s\n", $3
}'
}
# TAB completion for notes
function _notes() {
emulate -L ksh
local x files
files=($HOME/.notes/**/"$2"*)
[[ -e ${files[0]} ]] || return 1
COMPREPLY=()
for x in "${files[@]}"; do
COMPREPLY+=("$2${x#$HOME/.notes*/$2}")
done
}
complete -o default -F _notes n
Если Вы хотите портировать свой код на zsh:
function n() {
local files
files=(${@/#/~/.notes/})
${EDITOR:-vi} $files
}
function nls() {
tree -CR --noreport $HOME/.notes | awk '{
if (NF==1) print $1;
else if (NF==2) print $2;
else if (NF==3) printf " %s\n", $3
}'
}
# TAB completion for notes
function _notes() {
setopt local_options bare_glob_qual
local files
files=(~/.notes/**/$2*(N))
((#files)) && COMPREPLY=($2${^files##~/.notes*/$2})
}
complete -o default -F _notes n
Поскольку сообщения журнала не появляются в журнале нигде, я подозреваю, что у Вас нет системного журнала к журналируемой передаче настроенным правильно, и сообщения просто становятся отброшенными. Так как Вы находитесь на Arch, это легко зафиксировать. Удостоверьтесь что syslog-ng
пакет установлен:
pacman -S syslog-ng
Затем удостоверьтесь, что это включено на начальной загрузке:
systemctl enable syslog-ng
Наконец, начиная с включения сервисов автоматически не запускает их, запускают сервис:
systemctl start syslog-ng
Посмотрите эту страницу Arch Wiki для деталей.
Вот некоторый фон на том, почему эта проблема происходит:
Существует определенный способ зарегистрироваться к классическому системному журналу, и существует определенный способ зарегистрироваться к новому журналу systemd. Они являются несовместимыми; заявки, которые поддерживают системный журнал, не могут быть волшебно поданы для поддержки журнала - автор должен явно реализовать эту опцию. Приложения, которые поддерживают журнал systemd, обычно упоминаются как поддержка "встроенного API" при работе systemd системы.
Начиная с системного журнала API и журналируемый API отличаются, приложениям, которые не поддерживают журналируемый API, просто отбросят их сообщения журнала. Это - то, что происходило в Вашем случае.
syslog-ng
задание пакета состоит в том, чтобы перевести вызовы API системного журнала в журналируемые вызовы API. Таким образом сообщения системного журнала в конечном счете превращают его в журнал.
Некоторые демоны не записывали журналы в /var/log/
в Arch Linux, и конфигурация для syslog-ng
отличается от других ответов, которые я видел.
Обычной службы syslog-ng.service
здесь нет, вместо этого она называется syslog-ng@default.service
.
Это не сработает:
# systemctl enable syslog-ng
Failed to enable unit: Unit file syslog-ng.service does not exist.
Я должен сделать это немного иначе, согласно Arch Wiki:
# systemctl start syslog-ng@default.service
# systemctl enable syslog-ng@default.service
Created symlink /etc/systemd/system/multi-user.target.wants/syslog-ng@default.service → /usr/lib/systemd/system/syslog-ng@.service.
#
syslog-ng
был установлен, но не включен, я принял журналируемый, заменил его полностью.logger
только способный говорить с системным журналом? Что корректный путь состоит в том, чтобы зарегистрировать к журналируемому затем? – michas 02.01.2014, 03:08syslog-ng
передает сообщения, адресованные системному журналу к журналируемому. – strugee 02.01.2014, 03:33logger foobar;journalctl|grep foobar
в Вашей системе перечисляют запись? – michas 02.01.2014, 04:00