나는 / etc / bashrc의 pathmunge () 함수를 통해 캠을 보았다. 이것은 PATH에서 중복 항목을 유지한다는 점에서 훌륭하고 유용합니다.
그러나 이것은 다른 변수에 대한 패턴이어야합니다. CDPATH, LD_LIBRARY_PATH에는 중복 항목이 없어야합니다. 그래서 같은 방식으로 varmunge 함수를 작성하려고했습니다. 여기있어:
# varmunge() allows a one and only one addition of entries into the
# a PATH like environment variable. Good use cases for this function
# are: PATH, CDPATH, LD_LIBRARY_PATH
# example: varmunge PATH $HOME/bin [after | before]
#!/bin/sh
varmunge () {
case ":$1:" in
*:"$2":*)
;;
*)
if [ "$3" = "after" ] ; then
export $1=\$$1:$2 # These both fail
# ${1}=${$1}:$2
else
export $1=$2:\$$1 # blech.
# ${1}=$2:${$1}
fi
esac
}
그러나 아아, 작동하지 않습니다. 아무도 내 한심한 bash-ness를 고칠 수 있습니까?
감사 ...
다른 사람이 원하는 경우 올바른 bash 스크립트를 게시합니다.
#!/bin/sh
varmunge () {
case ":${!1}:" in
*:"$2":*)
;;
*)
if [ "$3" = "after" ] ; then
eval ${1}=${!1}:$2
else
eval ${1}=$2:${!1}
fi
esac
}
varprint() {
echo "${1}=${!1}"
}
# test varprint
VARTEST="path1:path2"
varprint VARTEST
# test varmunge
varmunge VARTEST path1
varmunge VARTEST path1 after
varmunge VARTEST path2
varmunge VARTEST path2 after
varmunge VARTEST path3
varmunge VARTEST path3 after
varmunge VARTEST path3
varmunge VARTEST path4 after
varmunge VARTEST path4
varprint VARTEST
정확히 작동하지 않는 것이 무엇인지 설명하지는 않았지만 파악 (또는 경험적으로 테스트)하기에 충분히 쉽습니다.
어쨌든 여기에 동일한 문제가 두 번 있습니다 (일단 해결하려고했지만 작동하도록 만드는 구성을 사용하지 못했음).
문제는 값이 아닌 처리하려는 변수 $1
의 이름 으로 확장 된다는 것 입니다.
따라서 전화를 걸고 회선이 확장 varmunge PATH /some/path
되면 원하는 곳으로 이동합니다 .":$1:"
:PATH:
:<value of $PATH>:
그렇게하려면 (bashism) 간접 확장 을 사용해야 합니다.
그래서 당신은 ":${!1}:"
거기 를 원합니다 .
마찬가지로 케이스 본문에서 eval
간접 할당 패턴 을 사용하려고했지만 export
그렇게 작동하지 않으므로 이스케이프 된 변수 이름을 다시 확장하지 않습니다.
운 좋게도 export
export가 할당 자체 를 수행하기 때문에 사용하려는 경우 여기에서 해당 트릭이 필요하지 않습니다 ( declare
및과 유사 printf -v
).
그래서 당신은 사용할 수 있습니다 export "$1=${!1}:$2"
및 export "$1=$2:${!1}"
적절한.
printf -v "$1" -- %s "${!1}:$2"
변수를 지속적으로 다시 내보내고 싶지 않은 경우 (bashism again) 등을 사용할 수도 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다