Respostas:
Aliases não são herdados. É por isso que eles são tradicionalmente instalados bashrc
e não profile
. Faça a sua origem script.sh
no seu .bashrc
ou em todo o sistema.
()
alias foo='echo foobar'
, enter, (foo)
outputs foobar
.
Isso ocorre porque o /etc/profile.d/ é usado apenas pelo shell de login interativo. No entanto, /etc/bash.bashrc
é usado pelo shell interativo sem logon.
Como geralmente defino alguns aliases globais para o sistema, comecei a criar /etc/bashrc.d
onde posso soltar um arquivo com alguns aliases globais:
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
Se você deseja que eles sejam herdados para subcascas, use as funções. Esses podem ser exportados para o ambiente ( export -f
), e os sub-shells terão essas funções definidas.
Então, para um de seus exemplos:
rmvr() { rm -rv "$@"; }
export -f rmvr
Se você tiver vários deles, defina primeiro a exportação:
set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
Pergunta semelhante, eu queria executar bash "modo de comando" e ter aliases disponíveis:
bash -i 'alias'
faz nada. Mas eu descobri o sinalizador -i, que executa as configurações interativas, então isso: bash -ci 'alias'
funciona.
Para sua pergunta, parece que você pode contorná-la "procurando" o arquivo, por exemplo:
bash -ci '. script.sh'
Os aliases funcionam. FWIW ...