내 파일에 정의된 함수가 있습니다 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는 이 점에서 이상합니다. .bashrc
Bash는 그것이 대화형 로그인 쉘인지 아닌지를 읽지 않습니다. 그리고 그 예외에도 예외가 있습니다: bash의 상위 프로세스가 rshd
or 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 세션 제외). 스크립트는 논리와 문서를 매우 잘 캡슐화합니다.