mirror of
https://github.com/ericonr/util-linux.git
synced 2024-04-21 09:12:35 -05:00
2c12297400
This patch brings support for automatic dangerous shell characters escape in umount autocompletion. Due to the very peculiar way for bash to handle autocompletion routines, proper escaping of the shell sequences only worked properly inside a function: _umount_point_list, which will add to the user's namespace at the next umount attempt of autocompleting mount point. It also translates calls of gensub to the portable alternatives sub and gsub, in order to allow the use of various awk implementations (mawk, Gnu, Busybox, etc), and as such kind of undoes a recent change to enforce the use of Gnu awk. The whole story landed into the Debian BTS initially: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933934 PS: It's been a few months since the patch is available, sorry for the delay; I only got myself a Github account quite recently... Signed-off-by: Étienne Mollier <etienne.mollier@mailoo.org>
80 lines
1.7 KiB
Plaintext
80 lines
1.7 KiB
Plaintext
_umount_points_list()
|
|
{
|
|
# List of characters to escape shamelessly stolen from "scp" completion
|
|
local escape_chars='[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]'
|
|
|
|
findmnt -lno TARGET | awk '{
|
|
if ($0 ~ "^"ENVIRON["HOME"]) {
|
|
homeless = $0
|
|
sub("^"ENVIRON["HOME"], "~", homeless)
|
|
gsub("'"$escape_chars"'", "\\\\&", homeless)
|
|
print homeless " "
|
|
}
|
|
if ($0 ~ "^"ENVIRON["PWD"]) {
|
|
reldir = $0
|
|
sub("^"ENVIRON["PWD"]"/?", "", reldir)
|
|
gsub("'"$escape_chars"'", "\\\\&", reldir)
|
|
print "./" reldir " "
|
|
print reldir " "
|
|
}
|
|
gsub("'"$escape_chars"'", "\\\\&")
|
|
print $0 " "
|
|
}'
|
|
}
|
|
|
|
_umount_module()
|
|
{
|
|
local cur prev OPTS
|
|
COMPREPLY=()
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
case $prev in
|
|
'-t'|'--types')
|
|
local TYPES
|
|
TYPES="
|
|
$(\ls /lib/modules/$(uname -r)/kernel/fs | awk '{print $1, "no" $1}')
|
|
$(awk '{print $NF, "no" $NF}' /proc/filesystems)
|
|
"
|
|
COMPREPLY=( $(compgen -W "$TYPES" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-h'|'--help'|'-V'|'--version')
|
|
return 0
|
|
;;
|
|
'-N'|'--namespace')
|
|
local NAMESPACE
|
|
NAMESPACE="$(lsns --type mnt --output PATH --noheadings)"
|
|
COMPREPLY=( $(compgen -W "$NAMESPACE" -- $cur) )
|
|
return 0
|
|
;;
|
|
esac
|
|
case $cur in
|
|
-*)
|
|
OPTS=" --all
|
|
--all-targets
|
|
--no-canonicalize
|
|
--detach-loop
|
|
--fake
|
|
--force
|
|
--internal-only
|
|
--namespace
|
|
--no-mtab
|
|
--lazy
|
|
--test-opts
|
|
--recursive
|
|
--read-only
|
|
--types
|
|
--quiet
|
|
--verbose
|
|
--help
|
|
--version"
|
|
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
local IFS=$'\n'
|
|
COMPREPLY=( $( compgen -W '$( _umount_points_list )' -- "$cur" ) )
|
|
}
|
|
complete -F _umount_module -o nospace umount
|