bashrc에서 로컬 함수를 어떻게 만들 수 있습니까?


40

내 .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 내부에서만 볼 수있게하는 방법이 있습니까?


2
내보내기가 필요하지 않은 경우 하위 ()쉘을 만들 수도 있습니다 . 간단한 경우에 대한 또 다른 가능성은 for version in 5.1 5.2루프를 사용하는 것 version입니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

답변:


40

unset에서 마지막 줄로 사용 하십시오 .bashrc.

unset -f do_stuff

기능을 삭제 / 설정 해제합니다 do_stuff.

변수를 삭제 / 설정 해제하려면 다음과 같이 변수를 호출하십시오.

unset variablename

여기서 설정되지 않은 유일한 방법입니까? 글쎄, 내 기능에 정말 길고 추악한 이름을 사용하면 다른 것과 충돌 할 가능성은 그리 크지 않을 것입니다.
hugomg

이것이 문제인 경우 기능이 존재하는 경우 frist를 확인하십시오 if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi.
혼돈

8
do_stuff다른 함수 내에서 사용 하면 작동하지 않습니다 . 해당 함수를 호출하면가 나타납니다 bash: do_stuff: command not found. 나는 이것이 op가 말한 정확한 사례가 아니라는 것을 알고 있지만 주목할 가치가 있습니다.
Burhan Ali


15

다른 옵션은 다른 스크립트 언어에서와 같이 밑줄을 사용하여이 기능을 공개하지 않을 것임을 나타냅니다. _do_foo를 입력 할 가능성은 매우 작으며 다른 사람과 충돌 할 가능성이 없습니다.


1
예, "_"를 사용하여 개인 기능을 수행하려는 의도를 나타내지 만 이는 충돌과 관련이 없습니다. 누구나 "_debug ()"또는 "_safe_copy ()"가 필요할 수 있습니다. 충돌을 피하는 데 도움이되는 것이 있다면 밑줄과 는 아무런 관련없습니다 .
Alois Mahdal

3

내가 생각할 수있는 유일한 해결책은 밑줄을 긋고 꽤 독특한 이름을 부여하고 아마도 화려한 팬츠 언어와 같은 점으로 이름을 지정하는 것입니다 ( 그러나 이것은sh 예전 에는 작동하지 않습니다 ).

도대체 충돌이 없습니다.

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

주석에서 제안한대로 서브 쉘을 사용할 수 있습니다.

#!/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은 놀라운 경이로운 원천입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.