bash 함수를 설정 해제하거나 제거하려면 어떻게합니까?


33

bash에서 환경 변수를 설정하거나 내 보내면 설정을 해제 할 수 있습니다 . 당신이 bash는 별칭을 설정하면, 당신은 할 수 unalias가 그것. 그러나이있을 것 같지 않습니다 unfunction .

예를 들어, .bash_aliases 파일 에서 설정 하고 쉘 초기화시 읽는 이 (사소한) bash 함수를 고려하십시오 .

function foo () { echo "bar" ; }

현재 쉘에서이 함수 정의를 지우려면 어떻게해야합니까?
초기화 파일을 변경하거나 셸을 다시 시작해도 계산되지 않습니다.


말한 unfunction것은 명령에 대한 좋은 이름이 될 것입니다 :-)
Joey

@Johannes Rössel : zsh 에 있습니다.
Chris Johnsen

흠. 아직도, 나는 이보다 약간 직관적이고 일관된 모든 것을 다루는 PowerShell의 방법을 발견합니다 :-)
Joey

답변:


50

해제 내장 명령이 옵션을 소요 -f, 삭제 기능 :

unset -f foo

양식 해제 에서 항목 배쉬 맨 페이지를 :

-f를 지정하면 각 이름은 쉘 함수를 나타내며 함수 정의는 제거됩니다.

참고 : -f이름이 같은 변수가 존재하는 경우에만 실제로 필요합니다. 당신은 또한 변수가 이름이없는 경우 foo, 다음 unset foo기능을 삭제합니다.


그것이 내가 놓친 것입니다. 내보내기 에서 -f매개 변수를 찾았 지만 unset 에서 찾지 못했습니다 . 감사.
quack quixote

2
@XavierStuvw : unset외부 명령이 아니며 쉘의 일부입니다 ( 이 경우에는 bash ). 에 man bash대한 항목을 찾아 보십시오 unset(관리자는 꽤 크며 섹션 unset아래에 있음 Shell Builtin Commands).
Chris Johnsen

4

참조 help unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

어느 쪽도 없습니다 unset --helpman unset불행하게도.


4
없다 man unset그것이이기 때문에 내장 명령의 내장 명령 대신있다 help. 일부 내장 명령의 경우 외부 실행 파일도 존재합니다. 의심스러운 경우 예를 들어보십시오 type mycommnad. 예를 들어 type unset대답합니다 unset is a shell builtin. 실행 파일이 존재하는지 알고 싶다면 which echo(또 다른 buikt-in) 시도해보십시오 . 이 --option_long명령은 일반적으로 실행 가능한 명령입니다. 시도 echo --help/bin/echo --help. :-).
Hastur

@Hastur 꼬리를 편집하여 답변에 의견을 추가하십시오. 검토자가 승인하면 2 점을받습니다.
XavierStuvw

1
... 자비에르 (Javier)라는 생각에 감사드립니다. 내장 명령 이라는 것을 놓쳤다 고 생각 하고 help대신 대신 사용해야 합니다 man. (실제로 명령 명령man bash 장에서 또는 직접 ...로 찾기 때문에 사실이 아닙니다 .) bash 쉘 아래에서 간단히 요청할 수 있으며 내장 명령 목록이 표시됩니다 . (시도 및 도). man BASH-BUILTINShelp:-)help helpman man
Hastur

1
@Hastur 당신은 모든 독자들의 이익을 위해 답을 완성 할 수 있습니다. 그런 다음 주석을 삭제하여 작은 인쇄 혼란을 제거 할 수 있습니다.
XavierStuvw

0

최근에 완전히 제거 nvm하고 다시 설치하고 환경을 제거 하고 싶었습니다 . 그것을 제거하는 것은 많은 nvm부분이 부분적으로 또는를 통해 쉘에 공급되는 쉘 기능의 보트로드 .bash_profile또는 .bashrc처음으로 설치할 때 알려주는 소싱 명령을 추가 한 곳으로 구현 되기 때문에 보이지 않는 것으로 나타났습니다 .

처음 which nvm에는 nvm명령을 명확하게 반환 하고 다른 명령을 여전히 발견 하여 당황 했지만 결국 declare -F에는 많은 쉘 기능이라는 것을 알았 습니다. 쉘을 죽이고 새로운 것을 시작하고 싶지 않았기 때문에 (여기서는 관련이없는 이유로) nvm다음과 같이 해당 쉘에서 함수를 삭제 했습니다.

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

그것에 대한 일부 변형은 어떤 이유로 든 비슷한 것을하고 싶거나 새로운 쉘을 다시 시작할 수 없거나 원하지 않는 사람에게 도움이 될 수 있습니다.

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