Когда вы входите в систему через ssh и pam _afs _session.so активен, он генерирует билет Kerberos и использует его для создания токена AFS. Когда вы выйдете из системы, он удалит и билет Kerberos, и токен AFS.
Как вы заметили, билеты Kerberos хранятся в файлах, а токены AFS хранятся в ядре, в PAG (Process Authentication Group ). При подключении через второй сеанс SSH библиотека pam _afs _session.so создаст новый билет Kerberos в новом файле и новый токен AFS в новом PAG.
Самый простой способ сохранить активным токен AFS в сеансе экрана GNU — это:
Как указано в комментариях к вашему вопросу, Bash не может завершить командную строку для команды без предварительной настройки и без изменения текущей среды. Bash не заглядывает в файлы и не пытается их интерпретировать, если вы явно не выполняете их или не исходите из них.
Я читал по этому вопросу, что такая функция вряд ли появится в Bash в ближайшее время из-за проблем с совместимостью и ресурсами — как оболочка, она предназначена для надежной работы на множестве различных систем с разнообразие целей и адаптация к предпочтениям самых разных пользователей; и у него есть только один человек в качестве разработчика и сопровождающего 1 .
В то время как Bash предоставляет инструменты для реализации автозавершения, генераторы автозавершения, по-видимому, задуманы как внешние средства. И действительно то, что вы ищете, может быть легко реализовано с помощью существующих инструментов и небольшого объема работы.
Учитывая пример скриптаfoo
:
#!/bin/bash
# Setting up completion for foo. Only if the script is sourced
if [ "$0" != "$BASH_SOURCE" ]; then
_foo() {
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W 'bar baz' -- "$cur") )
return 0
}
complete -F "_foo" "foo"
return
fi
# The body of foo -- what it does when executed
echo foo "$*"
#...
с помощью bash -автодополнение , самодостаточное -автодополнение можно включить, добавив символическую ссылку на foo
в каталог, в котором хранятся динамически загружаемые пользовательские дополнения:
ln -s /path/to/foo ~/.local/share/bash-completion/completions/
Точный путь может отличаться. Вы можете обратиться к часто задаваемым вопросам завершения bash -, чтобы узнать, как проверить его значение в вашей системе.
Без завершения bash -одним из подходов может быть определение функции завершения по умолчанию, которая ищет (файлы, соответствующие )командам, если они удовлетворяют определенным условиям; здесь мы используем ассоциативный массив в качестве белого списка (, чтобы избежать слепого поиска каждой команды в системе ). Этот код необходимо добавить в ваш.bashrc
(или эквивалентный файл, т. е. файл, который загружается в текущей среде каждый раз, когда запускается интерактивная оболочка ):
_default_completion () {
# Do nothing when completion is invoked for an empty command
if [ "$1" = "" ]; then
return 1
fi
# Get the command path, exit with failure if it can't be found
cmd=$(type -p "$1") || return 1
if [ "${_compwhitelist["${cmd##*/}"]}" = y ]; then
# Source the file corresponding to the command; on success,
# return 124 to trigger a new autocompletion attempt
source "$cmd" && return 124
fi
}
complete -D -F _default_completion -o bashdefault -o default
# The list of commands with embedded completion
declare -A _compwhitelist
_compwhitelist[foo]=y
Я знаю, вы просили решение, которое не требует редактирования файлов конфигурации,но обратите внимание, что определенная конфигурация всегда требуется. Существенная часть этого делается мейнтейнерами дистрибутива/пакета, даже если пользователи никогда не осознают этого.
1Ссылка :на домашнюю страницу Bash на веб-сайте Чета Рэми и пункт «A1» в соответствующем FAQ по Bash .