내 .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”이름이 범위 내에 있으므로 탭 완성 및 해당 기능을 실행할 수 있습니다 (잠재적으로 내 환경 변수를 엉망으로 만듭니다). “do_stuff”를 .bashrc 내부에서만 볼 수있게하는 방법이 있습니까?
답변
unset
에서 마지막 줄로 사용 하십시오 .bashrc
.
unset -f do_stuff
기능을 삭제 / 설정 해제합니다 do_stuff
.
변수를 삭제 / 설정 해제하려면 다음과 같이 변수를 호출하십시오.
unset variablename
답변
다른 옵션은 다른 스크립트 언어에서와 같이 밑줄을 사용하여이 기능을 공개하지 않을 것임을 나타냅니다. _do_foo를 입력 할 가능성은 매우 작으며 다른 사람과 충돌 할 가능성이 없습니다.
답변
내가 생각할 수있는 유일한 해결책은 밑줄을 긋고 꽤 독특한 이름을 부여하고 아마도 화려한 팬츠 언어와 같은 점으로 이름을 지정하는 것입니다 ( 그러나 이것은sh
예전 에는 작동하지 않습니다 ).
도대체 충돌이 없습니다.
_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
# Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
cat <<< `echo $(xargs printf <<< "$1")`; }
}
답변
주석에서 제안한대로 서브 쉘을 사용할 수 있습니다.
#!/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
). 그런 다음로 소스를 지정 .
합니다.
‘mise en abime’의 힘 sh
은 놀라운 경이로운 원천입니다.