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" 이름이 범위 내에 있으므로 탭 완성을 사용하고 함수를 실행할 수 있습니다(아마 환경 변수가 엉망이 될 수 있습니다). .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,'

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

'미장아비메'의 힘은 sh무서운 경이로움의 원천입니다.

관련 정보