서브 쉘 / 자식 프로세스의 별명 쉘에 대해 /etc/profile.d/alias.sh에 별명을 설정했습니다. 그러나 script.sh를

각 로그인 쉘에 대해 /etc/profile.d/alias.sh에 별명을 설정했습니다. 그러나 script.sh를 실행하면 해당 별칭을 사용할 수 없습니다. 서브 쉘이나 하위 프로세스에 대해서도 별칭을 설정하려면 어떻게해야합니까?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';


답변

별명은 상속되지 않습니다. 그들은 전통적으로 설정하는 이유 bashrc와하지 profile. 대신 또는 시스템 전체 script.sh에서 소스를 제공하십시오 .bashrc.


답변

/etc/profile.d/는 대화식 로그인 쉘에서만 사용되기 때문입니다. 그러나 /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

답변

서브 쉘로 상속 받으려면 대신 함수를 사용하십시오. 그것들은 환경으로 내 보내질 수 있고 ( 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

답변

비슷한 질문으로 bash “명령 모드”를 실행하고 별칭을 사용할 수 있기를 원했습니다.

bash -i 'alias'아무것도하지 않습니다. 그러나 대화 형 설정을 실행 하는 -i 플래그 를 발견 했으므로 bash -ci 'alias'작동합니다.

귀하의 질문에 대해 다음과 같이 파일을 “소싱”하여 파일을 피할 수 있습니다.

 bash -ci '. script.sh'

그런 다음 별칭이 작동합니다. FWIW …