Aliases in subshell / child process
Solution 1
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.
Solution 2
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
Solution 3
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
Related videos on Youtube
![lisak](https://i.stack.imgur.com/i4Bom.jpg?s=256&g=1)
Comments
-
lisak almost 2 years
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';
-
lisak almost 13 yearsBy inhereted, you mean that for instance exported variables are inherited and the rest is not ?
-
lisak almost 13 yearsI don't think that .bashrc helps... If you use that alias then in a subshell, it doesn't know it
-
jw013 almost 13 yearsbashrc 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
()
-
lisak almost 13 yearsI didn't know about aliasName() invocation, thank you
-
jw013 almost 13 yearsJust to be clear, what I meant was in bash,
alias foo='echo foobar'
, enter,(foo)
outputsfoobar
. -
Tongfei Chen about 4 yearsThis is super useful and solves my problem.