다양한 스크립트에서 사용할 수 있는 Bash 함수를 정의하는 방법

다양한 스크립트에서 사용할 수 있는 Bash 함수를 정의하는 방법

내 파일에 정의된 함수가 있습니다 bash. ~/.bashrc이를 통해 쉘 터미널에서 사용할 수 있습니다. 그런데 스크립트에서 호출해 보니 존재하지 않는 것 같습니다.

bash스크립트에서도 사용할 수 있는 함수를 어떻게 정의할 수 있나요 ?

답변1

~/.bash_profile스크립트로 읽히지 않으며 ~/.bashrc기본적으로 함수를 내보내지 않습니다. 이렇게 하려면 export -f다음과 같이 사용할 수 있습니다.

$ cat > script << 'EOF'
#!/bin/bash
foo
EOF
$ chmod a+x script
$ ./script
./script: line 2: foo: command not found
$ foo() { echo "works" ; } 
$ export -f foo
$ ./script
works

export -f foo~/.bash_profile이 함수는 로그인 후 스크립트에서 사용할 수 있도록 호출될 수도 있습니다 . 휴대가 불가능 하니 주의하세요 export -f.

더 나은 솔루션은 를 사용하는 것입니다 . file. 이는 이식성이 뛰어나고 특정 방식으로 설정된 환경에 의존하지 않습니다.

답변2

.bashrc대화형 셸에서만 읽을 수 있습니다. (실제로 이것은 지나치게 단순화한 것입니다. bash는 이 점에서 이상합니다. .bashrcBash는 그것이 대화형 로그인 쉘인지 아닌지를 읽지 않습니다. 그리고 그 예외에도 예외가 있습니다: bash의 상위 프로세스가 rshdor sshd이면 bash는 그것을 읽을 것입니다 .bashrc. 대화식이든 아니든).

알려진 위치에 있는 파일에 함수 정의를 배치하고 내장 함수 .(라고도 함 )를 사용하여 source해당 파일을 스크립트에 포함시킵니다 .

$ cat ~/lib/bash/my_functions.bash
foo () {
$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar

필요한 경우 ksh의 자동 로딩 기능을 따를 수 있습니다. 각 함수 정의를 함수와 동일한 이름을 가진 파일에 저장합니다. 변수에 함수 정의가 포함된 디렉터리 FPATH(콜론으로 구분된 디렉터리 목록) 를 나열합니다. 다음은 autoload요청 시가 아닌 즉시 함수를 로드하는 ksh의 대략적인 근사치입니다 .

autoload () {
  set -- "$(set +f; IFS=:;
            for d in $FPATH; do
              if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
            done)"
  [[ -n $1 ]] && . "$1"
}

답변3

필요기능? 그렇지 않은 경우 로직을 다음과 같이 추출해 보세요 $PATH.~/.bashrc

# echo public IP address
alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'

~/bin내에서는 다음을 사용 $PATH하여 ~/bin/wanip생성합니다.

#!/bin/bash

# echo public IP address
dig +short myip.opendns.com @resolver1.opendns.com

chmod 0755 ~/bin/wanip실행 가능하게 만들기 위해 실행하세요 . 이제 wanip다른 스크립트에서 실행할 수 있습니다.

나는 wanip독립형 Bash 스크립트를 사용하는 것을 좋아합니다. 이 논리를 보편적으로 사용할 수 있기를 원한다는 것을 상기시켜줍니다(현재 대화형 Bash 세션 제외). 스크립트는 논리와 문서를 매우 잘 캡슐화합니다.

관련 정보