Bash에서 파일을 가져오지만 특정 기능을 건너뛸 수 있습니까?

Bash에서 파일을 가져오지만 특정 기능을 건너뛸 수 있습니까?

내가 가지고 있다고 가정 해 봅시다 bash_functions.sh:

function test(){
}

function test2(){
}

내 안에 ~/.bashrc:

source ~/bash_functions.sh

구매 시 특정 기능 구매를 생략할 수 있나요? 내 말은 bash_functions.sh, test?

답변1

함수 정의에서 별칭인 foo () { … }경우 foo확장됩니다. 때로는 이것이 문제가 될 수도 있지만 여기서는 도움이 됩니다. 파일을 가져오기 전에 다른 이름의 별칭을 사용하면 foo다른 기능을 정의하게 됩니다. Bash에서는 비대화형 쉘에서 별칭 확장이 기본적으로 꺼져 있으므로 shopt -s expand_aliases.

sourced.sh다음을 포함하는 경우

foo () {
  echo "foo from sourced.sh"
}

그럼 이렇게 사용하세요

foo () {
  echo "old foo"
}
shopt -s expand_aliases   # necessary in bash; just skip in ash/ksh/zsh
alias foo=do_not_define_foo
. sourced.sh
unalias foo; unset -f do_not_define_foo
foo

그리고 당신은 그것을 얻습니다 old foo. 키워드는 별칭 확장을 방지 하므로 소스 파일은 foo () { … }함수 정의 구문을 대신 사용해야 합니다 .function foo { … }function

답변2

그러나 정확히는 아니지만 test() 함수를 재정의할 수 있습니다. 마지막 함수 정의가 항상 우선합니다. 따라서 소스 파일이 test()이후에 동일한 이름의 함수를 정의하면 후자의 함수가 소스 파일을 덮어씁니다. 나는 이를 활용하여 일부 스크립트에 개체 지향 기능을 제공합니다.

예:

bash_functions.sh:

test(){
    echo "This is the test function from bash_functions."
}
test2(){
    echo "This is the test2 function from bash_functions."
}

scripty_scripterson.sh

test2(){
    #this is thrown in just to show what happens in
    #the other direction
    echo "This is the test2 function from scripty."
}

source bash_functions.sh

test1(){
    echo "This is the test1 function from scripty."
}

test1
test2

명령줄에서:

$ ./scripty_scripterson.sh 
This is the test1 function from scripty.
This is the test2 function from bash_functions.

답변3

임시 파일을 생성하여 읽은 다음 삭제할 수 있습니다. "test" 함수를 제거하려면 함수 내부에 "}"가 없다고 가정합니다.

sed '/test()/,/}/d' testrc > ./tmprc && source ./tmprc && rm tmprc

답변4

그것은 불가능합니다. bash_functions.sh를 2개의 파일로 분할할 수 있습니다. 하나는 가져오려는 파일을 포함하고 다른 하나는 가져오지 않는 기능을 포함합니다. 세 번째 스크립트 파일을 사용하여 일반적인 사용을 위해 결합합니다.

관련 정보