Subshel​​l /子进程中的别名


15

我在/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';

Answers:


23

别名不被继承。这就是为什么他们传统上在设置bashrc和不profile。而是script.sh从您的.bashrc或系统范围的资源中获取您的资源。


通过inhereed,您的意思是例如导出的变量是继承的,其余的不是?
lisak 2011年

1
我认为.bashrc没有帮助...如果您在子shell中使用该别名,则它不知道
lisak 2011年

读取所有交互式非登录shell的bashrc,这就是为什么它应该工作的原因,因为您启动的大多数外壳都是交互式非登录shell,而别名在子外壳中也可以使用()
jw013,2011年

我不知道aliasName()的调用,谢谢
lisak 2011年

为了清楚起见,我的意思是用bash alias foo='echo foobar',enter,(foo)outputs foobar
jw013 2011年

10

这是因为/etc/profile.d/仅由交互式登录Shell使用。但是,/etc/bash.bashrc由交互式非登录外壳使用。

由于我通常会为系统设置一些全局别名,因此我开始创建/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

7

如果希望将它们继承到子Shell,请改用函数。这些可以导出到环境(export -f),然后子外壳将定义这些功能。

因此,对于您的示例之一:

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

0

类似的问题,我想运行bash“命令模式”并使用别名:

bash -i 'alias'什么也没做。但是我发现了-i标志,它确实运行交互式设置,因此:bash -ci 'alias'确实可行。

对于您的问题,看来您可以通过“采购”文件来规避它,例如:

 bash -ci '. script.sh'

然后别名起作用。FWIW ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.