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.