我在 /etc/profile.d/alias.sh 中为每个登录 shell 设置了别名。但是如果我运行 script.sh,我就不能使用该别名。我如何为子 shell 或子进程设置别名?
/etc/profile.d/alias.sh
alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
答案1
别名不可继承。这就是为什么它们传统上是在bashrc
而不是中设置的profile
。请改为script.sh
从您的.bashrc
或系统范围的 中获取您的 别名。
答案2
如果希望子 shell 继承这些函数,请使用函数。这些函数可以导出到环境 ( export -f
),然后子 shell 就会定义这些函数。
因此,对于您的其中一个例子:
rmvr() { rm -rv "$@"; }
export -f rmvr
如果您有一堆,那么请先设置导出:
set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
答案3
这是因为 /etc/profile.d/ 仅供交互式登录 shell 使用。但是,/etc/bash.bashrc
供交互式非登录 shell 使用。
由于我通常会为系统设置一些全局别名,因此我已经开始创建/etc/bashrc.d
可以放置具有一些全局别名的文件的位置:
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
答案4
你可以像这样使用 case 语句:
function execute() {
case $1 in
ls) $@ --color=auto ;;
grep) $@ --color=auto ;;
fgrep) $@ --color=auto ;;
egrep) $@ --color=auto ;;
*) $@ ;;
esac
}
( execute $@ )