source some_file
일부_파일:
doit ()
{
echo doit $1
}
export TEST=true
내가 출처라면일부 파일"doit" 함수와 TEST 변수는 명령줄에서 사용할 수 있습니다. 하지만 다음 스크립트를 실행하세요.
스크립트.sh:
#/bin/sh
echo $TEST
doit test2
TEST 값이 반환되지만 알 수 없는 함수 "doit"에 대한 오류가 발생합니다.
함수도 "내보낼" 수 있습니까? 아니면 거기에서 함수를 사용하려면 script.sh에서 some_file을 가져와야 합니까?
답변1
Bash에서는 스크립트가 호출하는 다른 쉘 스크립트로 함수 정의를 내보낼 수 있습니다.
export -f function_name
예를 들어 다음과 같은 간단한 예를 시도해 볼 수 있습니다.
./script1
:
#!/bin/bash
myfun() {
echo "Hello!"
}
export -f myfun
./script2
./script2
:
#!/bin/bash
myfun
그런 다음 전화하면 ./script1
출력이 표시됩니다.안녕하세요!.
답변2
"내보내기" 함수를 사용하면 export -f
함수 본문이 포함된 환경 변수가 생성됩니다. 다음 예를 고려하십시오.
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
즉, 쉘(Bash만?)만이 이 기능을 허용할 수 있습니다. Bash는 () {
as 함수로 시작하는 환경 변수 만 고려하므로 함수를 직접 설정할 수도 있습니다 .
$ fn2='() { echo Hi;}' sh -c fn2
Hi
$ fn3='() {' sh -c :
sh: fn3: line 1: syntax error: unexpected end of file
sh: error importing function definition for `fn3'
SSH를 통해 이 변수를 "내보내려면" 함수가 문자열로 필요합니다. -p
내장 함수( )의 인쇄 옵션( )을 통해 이 작업을 수행할 수 있습니다 -f
.declare
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
이는 SSH를 통해 실행해야 하는 더 복잡한 코드가 있는 경우 유용합니다. 다음 가상 스크립트를 고려해보세요.
#!/bin/bash
remote_main() {
local dest="$HOME/destination"
tar xzv -C "$dest"
chgrp -R www-data "$dest"
# Ensure that newly written files have the 'www-data' group too
find "$dest" -type d -exec chmod g+s {} \;
}
tar cz files/ | ssh user@host "$(declare -pf remote_main); remote_main"
답변3
확립된@Lekenstein의 답변...
를 사용하면 declare -pf
현재 셸에서 이전에 정의된 모든 함수가 STDOUT으로 출력됩니다.
이 시점에서 STDOUT을 원하는 곳으로 리디렉션하고 실제로 원하는 곳에 이전에 정의된 함수를 채울 수 있습니다.
아래 답변은 이를 변수에 채웁니다. 그런 다음 해당 변수와 새 사용자로 생성된 새 셸에서 실행하려는 함수에 대한 호출을 에코합니다. (일명 ) sudo
스위치를 사용하고 Bash를 실행하면 됩니다(파이프된 STDOUT을 실행 입력으로 수신함).-u
user
우리는 Bash 쉘에서 Bash 쉘로 이동한다는 것을 알고 있으므로 Bash가 이전 쉘에서 정의한 기능을 올바르게 해석할 것이라는 것을 알고 있습니다. 동일한 버전의 Bash 셸에서 동일한 버전의 새 Bash 셸 사이를 이동하는 한 구문은 문제가 없습니다.
서로 다른 쉘 간 또는 서로 다른 버전의 Bash가 있을 수 있는 시스템 간에 이동하는 경우 YMMV.
#!/bin/bash
foo() {
echo "hello from `whoami`"
}
FUNCTIONS=`declare -pf`; echo "$FUNCTIONS ; foo" | sudo -u otheruser bash
# $./test.sh
# hello from otheruser
답변4
eval "$(declare -F | sed -e 's/-f /-fx /')"
수출할 것이다모두기능.
나는 함수와 변수를 사용하는 동안 스크립트의 컨텍스트에서 디버깅하고 작업할 수 있도록 스크립트에서 대화형 셸을 시작하기 전에 종종 이 작업을 수행합니다.
예:
eval "$(declare -F | sed -e 's/-f /-fx /')"
export SOME IMPORTANT VARIABLES AND PASSWORDS
bash -i