19

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';
25

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.

| 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
  • 1
    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
  • 1
    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
  • 1
    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
13

If you want them to be inherited to sub-shells, use functions instead. Those can be exported to the environment (export -f), and sub-shells will then have those functions defined.

So, for one of your examples:

rmvr() { rm -rv "$@"; }
export -f rmvr

If you have a bunch of them, then set for export first:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
| improve this answer | |
  • 2
    This is super useful and solves my problem. – Tongfei Chen May 15 at 2:34
11

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
| improve this answer | |
0

Similar question, I wanted to run bash "command mode" and have aliases available:

bash -i 'alias' does nothing. But I discovered the -i flag which does run the interactive setups, so this: bash -ci 'alias' does work.

For your question, appears you can kind of circumvent it by "sourcing" the file, ex:

 bash -ci '. script.sh'

Then aliases work. FWIW...

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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