내가 가지고 있다고 가정 해 봅시다 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개의 파일로 분할할 수 있습니다. 하나는 가져오려는 파일을 포함하고 다른 하나는 가져오지 않는 기능을 포함합니다. 세 번째 스크립트 파일을 사용하여 일반적인 사용을 위해 결합합니다.