파일에 bash
함수를 정의했습니다 ~/.bashrc
. 이를 통해 쉘 터미널에서 사용할 수 있습니다. 그러나 스크립트 내에서 호출 할 때 존재하지 않는 것 같습니다.
bash
스크립트에서 사용할 함수를 어떻게 정의 할 수 있습니까?
/bin/sh
shebang 라인에서 사용 하고 있습니까?
파일에 bash
함수를 정의했습니다 ~/.bashrc
. 이를 통해 쉘 터미널에서 사용할 수 있습니다. 그러나 스크립트 내에서 호출 할 때 존재하지 않는 것 같습니다.
bash
스크립트에서 사용할 함수를 어떻게 정의 할 수 있습니까?
/bin/sh
shebang 라인에서 사용 하고 있습니까?
답변:
~/.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
입니다. 이는 훨씬 이식성이 뛰어나며 특정 방식으로 환경을 설정하는 데 의존하지 않습니다.
function myFunction { ... }
in ~/.bash_profile
과 같은 함수를 선언하면 좋을까요?
export
솔루션이 제대로 작동하는 것 같습니다. 감사.
foo
기능 이 필요하다는 것을 알고 file
있습니다 .2) file
호출 쉘을 확인하는 것보다 내용을 더 잘 제어 할 수 있습니다 foo
스크립트를 호출하기 전에 변경되지 않았습니다 . file
예를 들어, 안전 점검을 추가 하여 변경되지 않았는지 확인할 수 있습니다 . (쉽지는 않지만 가능합니다). (음, 정의 된 foo 함수에 대한 검사를 수행 할 수도 있지만 드리프트를 얻습니다 ^^ 방법 2가 더 깨끗하다고 생각합니다.) 3) file
더 이상 필요한 것은 포함하지 않습니다.
.bashrc
대화식 쉘에서만 읽습니다. (실제로, 그것은 지나치게 단순화 된 것입니다 : bash는 이와 관련하여 기발합니다. Bash는 .bashrc
로그인 쉘이거나 대화 형인지 여부를 읽지 않으며 예외도 예외가 있습니다 .bash의 부모 프로세스가 rshd
또는 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
변수에 함수 정의가 포함 된 디렉토리를 나열하십시오 (콜론으로 구분 된 디렉토리리스트). 다음은 ksh에 대한 대략적인 근사치입니다. autoload
실제로 주문형 대신 함수를 즉시로드합니다.
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"
}
기능 이 필요 하십니까 ? 그렇지 않은 경우 논리를에서 별도의 독립형 Bash 스크립트로 가져 오는 것을 고려하십시오 $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 세션 외에도). 이 스크립트는 논리와 문서를 훌륭하게 캡슐화합니다.