Behdad Esfahbod's daily notes on GNOME, Pango, Fedora, Persian Computing, Bob Dylan, and Dan Bern!

My Photo
Name:
Location: Toronto, Ontario, Canada

Ask Google.

Contact info
Google
Hacker Emblem Become a Friend of GNOME I Power Blogger
follow me on Twitter
Archives
July 2003
August 2003
October 2003
November 2003
December 2003
March 2004
April 2004
May 2004
July 2004
August 2004
September 2004
November 2004
March 2005
April 2005
May 2005
June 2005
July 2005
August 2005
September 2005
October 2005
November 2005
December 2005
January 2006
February 2006
March 2006
April 2006
May 2006
June 2006
July 2006
August 2006
September 2006
October 2006
November 2006
December 2006
January 2007
February 2007
March 2007
April 2007
May 2007
June 2007
July 2007
August 2007
September 2007
October 2007
November 2007
December 2007
January 2008
February 2008
March 2008
April 2008
May 2008
June 2008
July 2008
August 2008
October 2008
November 2008
December 2008
January 2009
March 2009
April 2009
May 2009
June 2009
July 2009
August 2009
November 2009
December 2009
March 2010
April 2010
May 2010
June 2010
July 2010
October 2010
November 2010
April 2011
May 2011
August 2011
September 2011
October 2011
November 2011
November 2012
June 2013
January 2014
May 2015
Current Posts
McEs, A Hacker Life
Tuesday, February 07, 2006
 bash_completion...

Now I've been in love with the bash_completion package for a couple years now. I've always wondered about how much performance hit does it cause, by loading all the completion rules for all commands known to it in every bash shell, which is default shell in any decent Linux system, every single time... But never measured before.

Tonight, I'm writing a shell script (will post soon), and I was wondering why does it take 0.66s for it to print out usage information. Indeed it was bash_completion. First disable it, time down to 0.09s. Neat. But then I simply added a single magic line to /etc/profile.d/bash_completion.sh:

[ -z "$PS1" ] && return

so it doesn't run in non-interactive shells. That's it!

Comments:
[[ $- = *i* ]] && return

Does the same thing and works in sh, ksh, bash
 
I don't think that portability to non-bash shells is an issue with bash_completion.sh ;-)
 
Mandriva uses:

if [ "$PS1" ] && [ -n "$BASH" ]; then
# source user config file if available,
# otherwise system wide config file
if [ -f $HOME/.bash_completion ]; then
. $HOME/.bash_completion
else
. /etc/sysconfig/bash-completion
fi

if [ -n "$ENABLE_BASH_COMPLETION" ]; then
. /etc/bash_completion
fi
fi


Is there any difference with your approach?
I think both don't run in non-interactive shells. Which distribution are you using?
 
I just thought I'd take this time to mention zsh if you've got a passion for autocompletion in general.

Amongst loads of other things, it offers pretty intelligent and advanced autocompletion for just about anything with the proper config. (But then again, it does handle a lot with autocompletion simply enabled and without any explicit rules set, too.)

anonymous@huh:~% gcc -*TAB*
-A -ansi -fshort-enums
-B -b -fsigned-bitfields
-C -c -fsigned-char
-D -d -fstrength-reduce
-E -fPIC -fstrict-prototype
-H -fall-virtual -fsyntax-only

..etc.

Similar rules for host completion, amongst other things can be added as I'm sure you may already be aware of with bash.

http://docs.cs.byu.edu/docs/zsh/ might be a good place to start if you're interested.

Cheers.
 
Thanks for all the comments. I'm using Fedora. Reported this bug:

https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=180419
 
Thanks for pointing this out. bash completion used to have code to guard against this, but it seems to have accidentally been removed quite a while back.

The next release will have this check reinstated.
 
Post a Comment



<< Archive
<< Home