많은 분들이 pathmunge
변수의 중복 항목을 방지하기 위해 Bourne 쉘 호환 도트 파일에서 사용되는 표준 함수 에 대해 잘 알고 계실 것입니다 PATH
. 또한 LD_LIBRARY_PATH
및 변수에 대해 유사한 함수를 만들었 MANPATH
으므로 my에 다음 세 가지 함수가 있습니다 .bashrc
.
# function to avoid adding duplicate entries to the PATH
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
# function to avoid adding duplicate entries to the LD_LIBRARY_PATH
ldpathmunge () {
case ":${LD_LIBRARY_PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$1
else
LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH
fi
esac
}
# function to avoid adding duplicate entries to the MANPATH
manpathmunge () {
case ":${MANPATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
MANPATH=$MANPATH:$1
else
MANPATH=$1:$MANPATH
fi
esac
}
파일 크기를 더 작게 유지하기 위해 이 세 가지 기능을 하나로 결합하는 우아한 방법이 있습니까 .bashrc
? C에서 참조로 전달하는 것과 유사하게 확인/설정할 변수를 전달할 수 있는 방법이 있을까요?
답변1
eval
알려진 변수 이름을 사용하여 변수 값을 가져오고 설정할 수 있습니다 . Bash 및스프린트:
varmunge ()
{
: '
Invocation: varmunge <varname> <dirpath> [after]
Function: Adds <dirpath> to the list of directories in <varname>. If <dirpath> is
already present in <varname> then <varname> is left unchanged. If the third
argument is "after" then <dirpath> is added to the end of <varname>, otherwise
it is added at the beginning.
Returns: 0 if everthing was all right, 1 if something went wrong.
' :
local pathlist
eval "pathlist=\"\$$1\"" 2>/dev/null || return 1
case ":$pathlist:" in
*:"$2":*)
;;
"::")
eval "$1=\"$2\"" 2>/dev/null || return 1
;;
*)
if [ "$3" = "after" ]; then
eval "$1=\"$pathlist:$2\"" 2>/dev/null || return 1
else
eval "$1=\"$2:$pathlist\"" 2>/dev/null || return 1
fi
;;
esac
return 0
}
답변2
Bash 4.3 이상에서는 declare -n
.
# function to avoid adding duplicate entries to the PATH
pathmunge () {
declare -n thepath=$1
case ":${thepath}:" in
*:"$2":*)
;;
*)
if [ "$3" = "after" ] ; then
thepath=$thepath:$2
else
thepath=$2:$thepath
fi
;;
esac
}
다음과 같이 호출할 수 있습니다.
pathmunge PATH ~/bin
pathmunge MANPATH /usr/local/man after