source some_file
some_file :
doit ()
{
echo doit $1
}
export TEST=true
나는 소스 경우 some_file 기능 “작은 동전”과 변수 TEST 명령 줄에서 사용할 수 있습니다. 그러나이 스크립트를 실행 :
script.sh :
#/bin/sh
echo $TEST
doit test2
TEST 값을 반환하지만 알 수없는 함수 “doit”에 대한 오류를 생성합니다.
함수를 “내보내기”할 수 있습니까, 아니면 script.sh에서 some_file을 소싱하여 함수를 사용해야합니까?
답변
Bash에서 함수 정의를 하위 쉘로 내보낼 수 있습니다.
export -f function_name
예를 들어 다음과 같은 간단한 예를 시도해보십시오.
./script1
:
#!/bin/bash
myfun() {
echo "Hello!"
}
export -f myfun
./script2
./script2
:
#!/bin/bash
myfun
그런 다음 전화 ./script1
하면 Hello! 출력이 표시됩니다 . .
답변
를 사용하여 함수를 “내보내기” export -f
는 함수 본문과 함께 환경 변수 를 만듭니다. 이 예제를 고려하십시오.
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
이것은 쉘 (Bash?) 만 기능을 받아 들일 수 있다는 것을 의미합니다. Bash는 함수로 시작하는 envvar 만 고려하므로 함수를 직접 설정할 수도 있습니다 () {
.
$ 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"
답변
에 구축 Lekensteyn의 대답 @ …
사용 declare -pf
하면 현재 쉘에서 이전에 정의 된 모든 기능을 STDOUT으로 출력합니다.
이 시점에서 STDOUT을 원하는 곳으로 리디렉션 할 수 있으며 원하는 곳에서 이전에 정의 된 기능을 적용 할 수 있습니다.
다음 답변은 변수에 넣습니다. 그런 다음 해당 변수와 새 사용자로 생성 된 새 셸에 실행하려는 함수의 호출을 에코합니다. 우리는 사용하여이 작업을 수행 할 sudo
로 -u
(일명. user
) 스위치와 단순히 (실행할 수있는 입력으로 파이프 STDOUT을받을 것이다) 배쉬를 실행.
우리가 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
답변
설명하는 방식이 아닌 함수를 내보낼 수 없습니다. 쉘은 ~/.bashrc
대화식 쉘의 시작시 에만 파일을 로드합니다 ( bash 맨 페이지 에서 “Invocation”검색 ).
프로그램을 시작할 때로드되는 “라이브러리”를 작성하면됩니다.
source "$HOME/lib/somefile"
비 대화식 기능 및 설정을 여기에 배치하십시오.
답변
eval "$(declare -F | sed -e 's/-f /-fx /')"
모든 기능 을 내 보냅니다 .
함수와 변수를 사용하는 동안 스크립트 컨텍스트에서 디버깅하고 작업 할 수 있도록 스크립트에서 대화식 셸을 시작하기 전에이 작업을 많이 수행합니다.
예:
eval "$(declare -F | sed -e 's/-f /-fx /')"
export SOME IMPORTANT VARIABLES AND PASSWORDS
bash -i
답변
함수는 서브 프로세스로 내보내지지 않습니다. 이것이 .kshrc 또는 .bashrc라는 파일이있는 이유입니다. 서브 쉘에서도 사용할 수있는 함수를 정의합니다.
스크립트를 실행하는 경우. * shrc 스크립트는 일반적으로 소스되지 않습니다. 에서처럼 명시 적으로 코딩해야 . ~/.kshrc
합니다.
답변
글쎄, 나는 리눅스를 처음 사용하지만 시도해 볼 수있다. 일부 파일에서는 ‘tmp / general’이라고 부르고 함수를 빌드합니다.
func1(){
echo "func from general"
}
쉘 스크립트에서 다음을 추가하십시오.
. /tmp/general
다음을 실행하십시오.
func1
화면이 나타납니다 : func from general
.