각 로그인 쉘에 대해 /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 …