Вы должны щелкнуть правой кнопкой мыши папку «Параметры совместного доступа», «Открыть эту папку» и пометить два параметра, связанные с гостевой консолью и разрешить операции управления файлами. Затем нажмите «Создать общий доступ»
. В Windows просто перейдите к Параметры совместного доступа . Если ваш компьютер Ubuntu там не отображается, попробуйте Super Key (или Windows Key) Поделитесь этой папкой и напишите Создать Share или \\ YourComputerHostname.
Вы можете использовать Программируемое завершение. Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.
Вы можете использовать Программируемое завершение. Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
/usr/share/bash-completion/completions/<program>
– peter
27 September 2017 в 00:26
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
Для static autocompletion (--help / --verbose) добавьте это:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD - это индекс слова, содержащего текущую позицию курсора. COMPREPLY - это переменная массива, из которой Bash считывает возможные доработки. И команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":
compgen -W "--help --verbose --version" -- "<userinput>"
Источник: http://www.debian-administration.org/articles/316
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда complete имеет опцию -W, которая делает правильные вещи.
Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB> автозаполняет для меня.
Вот полный учебник.
Давайте посмотрим пример скрипта под названием admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание.
И здесь у вас есть сценарий автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить скрипт автозаполнения в bashrc как
source /path/to/your/autocomplete.sh
или скопировать его в /etc/bash.completion.d
Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
Для static autocompletion (--help / --verbose) добавьте это:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD - это индекс слова, содержащего текущую позицию курсора. COMPREPLY - это переменная массива, из которой Bash считывает возможные доработки. И команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":
compgen -W "--help --verbose --version" -- "<userinput>"
Источник: http://www.debian-administration.org/articles/316
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда complete имеет опцию -W, которая делает правильные вещи.
Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB> автозаполняет для меня.
Вот полный учебник.
Давайте посмотрим пример скрипта под названием admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание.
И здесь у вас есть сценарий автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить скрипт автозаполнения в bashrc как
source /path/to/your/autocomplete.sh
или скопировать его в /etc/bash.completion.d
Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
(--help
/ --verbose
) добавьте это:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
- это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD
- это индекс слова, содержащего текущую позицию курсора. COMPREPLY
- это переменная массива, из которой Bash считывает возможные пополнения. Команда compgen
возвращает массив элементов из --help
, --verbose
и --version
, соответствующих текущему слову "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Источник: http: // www.debian-administration.org/articles/316
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete
имеет опцию -W
, которая просто делает правильную вещь.
Для Например, у меня есть следующие строки в моей .bashrc
, чтобы автозаполнять программу под названием jupyter :
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB>
автозаполняет для меня.
docs на gnu.org полезны.
Кажется, что он полагается на правильную настройку IFS
, но это не вызвало у меня никаких проблем.
Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete
в вашем ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
Вот полный учебник.
Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.
И здесь у вас есть сценарий автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить скрипт автозаполнения в bashrc как
source /path/to/your/autocomplete.sh
или скопировать его в /etc/bash.completion.d
Все пополнения bash хранятся в /etc/bash_completion.d/
. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool
.
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
(--help
/ --verbose
) добавьте это:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
- это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD
- это индекс слова, содержащего текущую позицию курсора. COMPREPLY
- это переменная массива, из которой Bash считывает возможные пополнения. Команда compgen
возвращает массив элементов из --help
, --verbose
и --version
, соответствующих текущему слову "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Источник: http: // www.debian-administration.org/articles/316
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete
имеет опцию -W
, которая просто делает правильную вещь.
Для Например, у меня есть следующие строки в моей .bashrc
, чтобы автозаполнять программу под названием jupyter :
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB>
автозаполняет для меня.
docs на gnu.org полезны.
Кажется, что он полагается на правильную настройку IFS
, но это не вызвало у меня никаких проблем.
Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete
в вашем ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
Вот полный учебник.
Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.
И здесь у вас есть сценарий автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить скрипт автозаполнения в bashrc как
source /path/to/your/autocomplete.sh
или скопировать его в /etc/bash.completion.d
Все пополнения bash хранятся в /etc/bash_completion.d/
. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool
.
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete
имеет опцию -W
, которая просто делает правильную вещь.
Для Например, у меня есть следующие строки в моей .bashrc
, чтобы автозаполнять программу под названием jupyter :
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB>
автозаполняет для меня.
docs на gnu.org полезны.
Кажется, что он полагается на правильную настройку IFS
, но это не вызвало у меня никаких проблем.
Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete
в вашем ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
Вот полный учебник.
Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.
И здесь у вас есть сценарий автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения - это имя скрипта, к которому вы хотите добавить автозаполнение. Все, что вам нужно сделать, это добавить скрипт автозаполнения в bashrc как
source /path/to/your/autocomplete.sh
или скопировать его в /etc/bash.completion.d
Все пополнения bash хранятся в /etc/bash_completion.d/
. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool
.
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
(--help
/ --verbose
) добавьте это:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
- это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD
- это индекс слова, содержащего текущую позицию курсора. COMPREPLY
- это переменная массива, из которой Bash считывает возможные пополнения. Команда compgen
возвращает массив элементов из --help
, --verbose
и --version
, соответствующих текущему слову "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Источник: http: // www.debian-administration.org/articles/316
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete
имеет опцию -W
, которая просто делает правильную вещь.
Для Например, у меня есть следующие строки в моей .bashrc
, чтобы автозаполнять программу под названием jupyter :
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB>
автозаполняет для меня.
docs на gnu.org полезны.
Кажется, что он полагается на правильную настройку IFS
, но это не вызвало у меня никаких проблем.
Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete
в вашем ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi