내 .bashrc에 중복된 코드가 있어서 함수를 사용하여 단순화했습니다.
do_stuff() {
local version=$1
export FOO_${version}_X="17"
export FOO_${version}_Y="42"
}
do_stuff '5.1'
do_stuff '5.2'
그러나 이제 쉘을 사용할 때 "do_stuff" 이름이 범위 내에 있으므로 탭 완성을 사용하고 함수를 실행할 수 있습니다(아마 환경 변수가 엉망이 될 수 있습니다). .bashrc 내에서만 "do_stuff"를 표시할 수 있는 방법이 있나요?
답변1
unset
마지막 줄로 사용하십시오 .bashrc
.
unset -f do_stuff
기능이 제거/설정 해제됩니다 do_stuff
.
변수를 제거/설정 해제하려면 다음과 같이 호출하세요.
unset variablename
답변2
또 다른 옵션은 다른 스크립팅 언어처럼 밑줄을 사용하여 이 함수를 공개할 의도가 없음을 나타내는 것입니다. _do_foo를 입력할 가능성은 매우 낮으며 다른 사람과 충돌할 가능성이 없습니다.
답변3
제가 생각할 수 있는 유일한 해결책은 이를 강조하고 매우 독특한 이름을 지정하는 것입니다. 어쩌면 Fancy Pants 언어(하지만 옛날에는 이게 통하지 않았어sh
).
이런, 이것은 어떤 것과도 충돌하지 않습니다:
_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
# Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
cat <<< `echo $(xargs printf <<< "$1")`; }
}
답변4
의견에서 제안한 대로 서브쉘을 사용할 수 있습니다.
#!/bin/bash
. <(
do_stuff() {
local version="$1" valid='^\w+$'
[[ "$version" =~ $valid ]] &&
cat <<SIDE || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
}
do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
do_stuff 5_1
do_stuff 5_2
)
do_keep() { :; } # just get sure the report below actually works
set | egrep '(do_|FOO_)' | sed -e 's,^,set:\x09,'
우리가 원하는 유일한 부작용을 달성하기 위해 서브쉘 표준 출력에 또 다른 스크립트를 작성합니다( here
document 사용 <<SIDE
). 그런 다음 .
.
'미장아비메'의 힘은 sh
무서운 경이로움의 원천입니다.