Фальшивый ответ кажется недостаточным для этого поддельного вопроса; поддержка сборки zsh для каталогов автомобилей работает на каталогах (fake-файлы dir:names
), а не на шаблонах файлов в них. Это удобно для добавления специфических именованных файлов в каталог, который может подходить для automount
или sshfs
или настройки типа NetApp .snapshot
, в которых каталог, монтируемый в каталог, является известным статическим именем, ALAS
.
autoload -U compinit
compinit
zstyle ':completion:*' fake-files $HOME/.avfs:'ALAS POOR YORICK'
zshall(1)
говорит, что "имена" - это строки, а эксперименты указывают на мета-символы (например #
или \#
или '*(e: "echo hi":)'
) "не работают" по-разному, поэтому я не знаю, как прокрасть глобус в часть имен утверждения fake-файлов
. (Рассмотрение Src/Zle/computil.c
может точно показать, какими могут быть имена, но это было бы больше похоже на работу). (Также, использование рекурсивных глобусов в позиции каталога для именования архивных файлов не летало, но опять же, потребуется погружение на C, чтобы увидеть, сколько подделок
позволяет вам уйти от этого. )
С помощью compdef
можно перечислить завершения каталога .avfs
:
compdef '_files -g $HOME/.avfs/\*' -p \^
function andthehash {
reply=($REPLY $REPLY\#)
}
compdef "_files -g $HOME/.avfs/'*(+andthehash)'" -p \^
За исключением того, что это не удастся, так как он покажет файлы #
только тогда, когда это не имеет значения, и, таким образом, не сможет завершить их на них. (Есть продуктивное использование этой формы, хотя и не для этого случая.)
Использование zstyle
приближает вас к следующему .zshrc
:
autoload -U compinit
compinit
function UnderAVFS {
local pdir
[[ -z $1 ]] && return 1
pdir=$1:a
[[ ! -d $pdir ]] && pdir=$pdir:h
[[ ! -d $pdir || $pdir == . ]] && return 1
while [[ $pdir != / ]]; do
[[ $pdir == $HOME/.avfs ]] && return 0
pdir=$pdir:h
done
return 1
}
function AVFSExtras {
if UnderAVFS $REPLY; then
reply=($REPLY)
# TODO embiggen list of archive suffixes
[[ $REPLY == *.(bz2|tbz2) ]] && reply+=($REPLY\#)
fi
}
# Try to match avfs, otherwise the default pattern. Probably could greatly
# benefit from caching, to avoid hits on UnderAVFS function.
zstyle ':completion:*' file-patterns '*(+AVFSExtras):avfs-files' '%p:all-files'
Однако, он может заполнять только до \#/
бита (на debian squeeze virt с настройкой avfs по умолчанию), но не в виртуальную файловую систему для архива, поэтому потребуется дополнительная работа, чтобы занести заполненные файлы в архивы. Я предполагаю через _call_program ... ls
или что-то в этом роде для завершения в бите \#
, если только нет более элегантного способа обмануть zsh
, чтобы поверить в то, что каталоги, которых не существует, существуют.
Плохие новости! Завершение не проходит через _path_files
для поддельных каталогов; подозреваю, что это связано с zsh globbing. Как zsh 4.something on, так и zsh 5.0.8 демонстрируют проблему. Поэтому я подозреваю, что для полного исправления потребовались бы патчи к _path_files
, или чтобы написать что-нибудь другое, что в противном случае завершилось бы на этих поддельных каталогах. Отладочная трасса завершения может быть сгенерирована путем ввода ls /root/.avfs/root/sometar.gz\#/
, а затем в конце этого ввода controll-x
и затем ?
, предполагая, что связующая клавиша -e
и что _complete_debug
обязательно скажет клавишу keycombo, если кто-то захочет разобраться, почему это не удается.
Así que finalmente pude descifrar la pieza faltante del rompecabezas. Gracias a algunos excelentes consejos de @JdeBP pude determinar:
Configurar XDG _RUNTIME _DIR para exportar "/run/user/$UID" resolvió mi problema
Pasos que seguí para obtener el comportamiento deseado:
% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in
Все это довольно уродливые обходные пути.
Как было сказано, проблема:
You are not logging in. You are augmenting the privileges of your existing login session […]
Таким образом, «просто» войти…
Если вы находитесь на сервере, вам нужно использовать терминал. Я должен был задать тот же вопрос , но, наконец, смог его выяснить. Решение так же просто, как запустить эту команду, чтобы переключиться на вашего пользователя (, соответственно запустить соответствующую оболочку с этим пользователем):
$ sudo machinectl shell --uid www-data
Обратите внимание, что sudo loginctl enable-linger www-data
по-прежнему полезен, если вы собираетесь запускать службы или около того там, чтобы они запускались при загрузке. В противном случае они будут запускаться только при «логине» этого пользователя.