Package: bash
Version: 3.1dfsg-9
Severity: wishlist
The default /etc/bash_completion in Debian/sid takes 216kb, and
a couple of scripts in /etc/bash_completion.d add another 100kb.
To load this, my system needs half a second, a perceivable and
quite annoying delay on every shell start.
I wrote a simple script, that automatically moves the completion
functions from /etc/bash_completion and /etc/bash_completion.d
to a separate directory and creates a drop-in replacement for
/etc/bash_completion - which will load any of those completion
functions when it is requested for the first time. By this, we
greatly reduce the loading time (the replacement script is ~30kb)
and also the memory footprint (as we rarely need every completion
function in every bash session).
The generator script is intended to be run once the base script
/etc/bash_completion is installed and then, every time something
is added to /etc/bash_completion.d. I'd like to propose it for
the bash package -- maybe as an optional part of installation.
The generator script is attached, any comments are welcome.
-- System Information:
Debian Release: lenny/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.24-1-686 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages bash depends on:
ii base-files 4.0.2 Debian base system miscellaneous f
ii debianutils 2.28.3 Miscellaneous utilities specific t
ii libc6 2.7-8 GNU C Library: Shared libraries
ii libncurses5 5.6+20080203-1 Shared libraries for terminal hand
Versions of packages bash recommends:
pn bash-completion <none> (no description available)
-- no debconf information
BASH_COMPLETION=/etc/bash_completion
BASH_DYNCOMPLETION=/etc/bash_dyncompletion
BASH_DYNCOMPLETION_DIR=/etc/bash_dyncompletion.d
echo "Read static completions from $BASH_COMPLETION"
. "$BASH_COMPLETION" || exit 1
echo "Create dynamic completion file $BASH_DYNCOMPLETION"
touch "$BASH_DYNCOMPLETION" || exit 1
echo "Create dynamic completion directory $BASH_DYNCOMPLETION_DIR"
mkdir -p "$BASH_DYNCOMPLETION_DIR" || exit 1
echo -n "Populate dynamic completion directory:"
FUNCS=$(declare -f | grep '^[a-zA-Z_][a-zA-Z0-9_]* () $' | cut -f 1 -d ' ')
for FN in $FUNCS ; do
echo -n " $FN"
declare -f $FN > "$BASH_DYNCOMPLETION_DIR/$FN"
eval "$FN () { . '$BASH_DYNCOMPLETION_DIR/$FN' ; $FN \"[EMAIL PROTECTED]" ;
}"
done
echo
echo "Write dynamic completion file $BASH_DYNCOMPLETION"
exec > "$BASH_DYNCOMPLETION"
cat <<EOF
# $(basename $BASH_DYNCOMPLETION) - load-by-need bash completions
# actual completion functions are stored in $BASH_DYNCOMPLETION_DIR
# this file and directory are generated from $BASH_COMPLETION
shopt -s extglob progcomp
EOF
declare -p BASH_COMPLETION 2>/dev/null
declare -p bash205 2>/dev/null
declare -p bash205b 2>/dev/null
declare -p bash3 2>/dev/null
declare -f
complete -p
exit 0