bashrc에서 로컬 함수를 어떻게 만들 수 있습니까? 내 .bashrc에는 반복적 인

내 .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,'

우리는 원하는 유일한 부작용을 위해 서브 쉘 표준 출력에 다른 스크립트를 작성합니다 ( heredocument 사용 <<SIDE). 그런 다음로 소스를 지정 .합니다.

‘mise en abime’의 힘 sh은 놀라운 경이로운 원천입니다.