On 03/09/2017 02:48 AM, Ville Skyttä wrote:
> I don't know what the reason for making the variable read only is. But
> I think you could work around it by setting BASH_COMPLETION_COMPAT_DIR
> to a fake value, e.g. /prevent/sourcing in your rc files before the
> profile.d snippet is sourced (thus preventing it from loading
> bash_completion), and then unsetting it before "manually" loading the
> profile.d snippet where you want, and let it do its job unmodified.

Ville,

Problem here is that bash invokes /etc/profile prior to the end-user having 
control via .bashrc.  All that stuff in /etc/profile.d/bash_completion.sh is 
performed outside my control. (i prefer not to mangle up too many 
system-provided files, or affect my user's expectations of the environment)

It might be possible to set it via 'pam_env' or something (which *should* take 
effect prior to the shell invoking /etc/profile) That's a little messy, and i'd 
prefer not to have to bring yet another component into the picture.

But, let's do a proof-of-concept:

    # cat ~/.pam_environment
    BASH_COMPLETION_COMPAT_DIR="BOGUS"
    
    # cat /root/.bashrc
    .....
    \unset -f unalias ; \unalias -a ; \unset -f command
    \unset LD_LIBRARY_PATH LD_PRELOAD SHELLOPTS CDPATH HISTFILE HOSTFILE 
INPUTRC 2>/dev/null
    confpath="$(command -p getconf PATH 2>/dev/null)"
    # Establish baseline path with no NFS components
    export PATH="/opt/sbin:/opt/bin:/sbin:/usr/sbin:${confpath:-/bin:/usr/bin}"
    \type typeset >/dev/null && \unset -f $(\typeset -f | \grep '()' | \cut -d' 
' -f1)
    .....
    is_shell_interactive() { [ "${-%i*}" != "${-}" ] ;}
    .....
    if is_shell_interactive; then
        # RELOAD bash-completion
    echo "DEBUG: 
BASH_COMPLETION_COMPAT_DIR[before]=${BASH_COMPLETION_COMPAT_DIR}" 1>&2
    unset BASH_COMPLETION_COMPAT_DIR
    . /etc/profile.d/bash_completion.sh
    echo "DEBUG: 
BASH_COMPLETION_COMPAT_DIR[after]=${BASH_COMPLETION_COMPAT_DIR}" 1>&2

Results in, when i remote 'ssh' login:

    DEBUG: BASH_COMPLETION_COMPAT_DIR[before]="BOGUS"
    DEBUG: BASH_COMPLETION_COMPAT_DIR[after]=/etc/bash_completion.d

    # set | grep longopt\ \(
    _longopt ()
    _split_longopt ()

So, indeed, that *will* work -- presuming pam_env PAM enabled services (my 
ssh+su+login config at least uses it).

Thanks for the idea.  That gets me a drop on doing this now (other than what i 
was doing, which was just invoking the two command lines that 
/etc/profile.d/bash_completion.sh script was doing inside the conditional 
block).   I think it still would be conceptually better to not have to rely on 
pam_env for this to work, and have bash-completion implement some re-sourcable 
invocation mechanism.

--stephen

_______________________________________________
Bash-completion-devel mailing list
Bash-completion-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/bash-completion-devel

Reply via email to