Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I set up aliases in /etc/profile.d/alias.sh for each login shell. But if I run script.sh, I can't use that alias. How can I set alias even for subshells or child processes ?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
share|improve this question
add comment

2 Answers

up vote 4 down vote accepted

Aliases are not inherited. That's why they are traditionally set in bashrc and not profile. Source your script.sh from your .bashrc or the system-wide one instead.

share|improve this answer
    
By inhereted, you mean that for instance exported variables are inherited and the rest is not ? –  lisak Aug 5 '11 at 16:03
    
I don't think that .bashrc helps... If you use that alias then in a subshell, it doesn't know it –  lisak Aug 5 '11 at 16:06
    
bashrc is read for all interactive non-login shells which is why this should work since most shells you start up are interactive non-login shells, and aliases do work in subshells with () –  jw013 Aug 5 '11 at 16:12
    
I didn't know about aliasName() invocation, thank you –  lisak Aug 5 '11 at 16:18
    
Just to be clear, what I meant was in bash, alias foo='echo foobar', enter, (foo) outputs foobar. –  jw013 Aug 5 '11 at 16:21
add comment

It is because /etc/profile.d/ is used only by interactive login shell. However, /etc/bash.bashrc is used by interactive non-login shell.

As I usually do set some global aliases for system, I have started to create /etc/bashrc.d where I can drop a file with some global aliases:

    HAVE_BASHRC_D=`cat /etc/bash.bashrc | grep -F '/etc/bashrc.d' | wc -l`

    if [ ! -d /etc/bashrc.d ]; then
            mkdir -p /etc/bashrc.d
    fi
    if [ "$HAVE_BASHRC_D" == "0" ]; then
        echo "Setting up bash aliases"
            (cat <<-'EOF'
                                    if [ -d /etc/bashrc.d ]; then
                                      for i in /etc/bashrc.d/*.sh; do
                                        if [ -r $i ]; then
                                          . $i
                                        fi
                                      done
                                      unset i
                                    fi
                            EOF
            ) >> /etc/bash.bashrc

    fi
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.