명령줄의 스크립트에서 함수를 실행하려면 어떻게 해야 합니까?
저는 몇 가지 기능이 있는 대본을 가지고 있습니다.
명령줄에서 직접 기능 중 하나를 실행할 수 있습니까?
이런 거?
myScript.sh func()
다른 답변은 맞지만 bash 스크립트에 액세스할 수 있는 경우 수정하고 특별한 파라미터를 끝에 붙일 수 있습니다."$@"
- 지정한 명령줄의 인수로 확장됩니다.이 인수는 "alone"이므로 셸은 이들을 말 그대로 호출하려고 합니다.여기서 함수 이름을 첫 번째 인수로 지정할 수 있습니다.예:
$ cat test.sh
testA() {
echo "TEST A $1";
}
testB() {
echo "TEST B $2";
}
"$@"
$ bash test.sh
$ bash test.sh testA
TEST A
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2
광택을 위해 먼저 명령어가 존재하며 함수인지 확인할 수 있습니다.
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
스크립트가 함수만 정의하고 다른 작업은 하지 않는 경우 먼저 현재 셸의 컨텍스트 내에서 스크립트를 실행할 수 있습니다.source
또는.
명령어를 입력하고 함수를 호출합니다.봐help source
자세한 정보는.
다음 명령어는 처음에 컨텍스트에 함수를 등록한 후 호출합니다.
. ./myScript.sh && function_name
간단히 말하면, 아니다.
스크립트의 모든 기능을 사용자 환경으로 Import할 수 있습니다.source
(help source
(자세한 것은 이쪽)을 참조해 주세요.이것은 스크립트를 실행하는 효과도 있으므로 주의해 주세요.
셸 스크립트에서 함수를 공유 라이브러리인 것처럼 호출할 수 없습니다.
사용.case
#!/bin/bash
fun1 () {
echo "run function1"
[[ "$@" ]] && echo "options: $@"
}
fun2 () {
echo "run function2"
[[ "$@" ]] && echo "options: $@"
}
case $1 in
fun1) "$@"; exit;;
fun2) "$@"; exit;;
esac
fun1
fun2
이 스크립트는 functions fun1 및 fun2를 실행하지만 옵션 fun1 또는 fun2로 시작하면 args(제공된 경우)로 지정된 기능만 실행되며 종료됩니다.사용.
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
이전에 실행해서는 안 되는 bash 스크립트의 함수가 필요한 경우(예: bash 스크립트의 함수)source
) 및 에 관한 문제@$
myScript 입니다.sh는 다음으로 2회 실행됩니다.그것은...그래서 sed로 그 기능을 풀 수 있는 아이디어가 떠올랐습니다.
sed -n "/^func ()/,/^}/p" myScript.sh
필요할 때 실행하기 위해 파일에 저장해서source
:
sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
편집: 경고 - 모든 경우에 해당되지는 않지만 많은 공용 스크립트에서 잘 작동합니다.
"control"이라는 이름의 bash 스크립트가 있고 그 안에 "build"라는 함수가 있는 경우:
function build() {
...
}
다음에, 다음과 같이 호출할 수 있습니다(그것이 있는 디렉토리에서).
./control build
다른 폴더 안에 있으면 다음과 같이 됩니다.
another_folder/control build
파일명이 「control.sh」인 경우는, 다음과 같이 함수를 호출할 수 있습니다.
./control.sh build
해결된 게시물입니다만, 제가 선호하는 솔루션에 대해 말씀드리겠습니다. 스크립트인 '원라이너'를 합니다.eval_func.sh
:
#!/bin/bash
source $1 && shift && "@a"
다음으로 스크립트 내의 함수를 호출합니다.
./eval_func.sh <any script> <any function> <any args>...
수용된 솔루션에서 우연히 마주친 문제는 다른 스크립트 내에서 함수 포함 스크립트를 소싱할 때 후자의 인수가 전자의 인수에 의해 평가되어 오류가 발생한다는 것입니다.
감사하지만, 는 종종 답변이 마음에 .source
세션의 스크립트(현재 셸의 파일을 읽고 실행) 또는 직접 수정합니다.
한두 줄의 '부트스트랩' 파일을 작성하여 실행하는 것이 더 편리합니다.메인 스크립트 테스트가 쉬워지고 셸 세션에 부작용이 없으며 테스트용으로 다른 환경을 시뮬레이트하는 작업을 로드할 수 있습니다.예...
# breakfast.sh
make_donuts() {
echo 'donuts!'
}
make_bagels() {
echo 'bagels!'
}
# bootstrap.sh
source 'breakfast.sh'
make_donuts
그냥 뛰어요!./bootstrap.sh
python, ruby, 기타 스크립트에서도 같은 아이디어를 사용할 수 있습니다.
왜 도움이 되는가?예를 들어, 어떤 이유로 인해 생활이 복잡해졌다고 가정해 봅시다.또, 스크립트는 다른 환경에서 다른 상태로 사용되고 있는 경우도 있습니다.예를 들어 터미널 세션이나 클라우드 프로바이더의 새롭고 멋진 기능 등이 있습니다.또한 간단한 방법을 사용하여 터미널에서 클라우드 환경을 테스트하고자 합니다.문제 없습니다. 부트스트랩은 기본 상태를 로드할 수 있습니다.
# breakfast.sh
# Now it has to do slightly different things
# depending on where the script lives!
make_donuts() {
if [[ $AWS_ENV_VAR ]]
then
echo '/donuts'
elif [[ $AZURE_ENV_VAR ]]
then
echo '\donuts'
else
echo '/keto_diet'
fi
}
부트스트랩이 인수를 받아들이도록 하면 셸 세션에 다음 행이1개만 있는 상태에서 다른 스테이트를 로드하여 함수를 씹을 수 있습니다.
# bootstrap.sh
source 'breakfast.sh'
case $1 in
AWS)
AWS_ENV_VAR="arn::mumbo:jumbo:12345"
;;
AZURE)
AZURE_ENV_VAR="cloud::woo:_impress"
;;
esac
make_donuts # You could use $2 here to name the function you wanna, but careful if evaluating directly.
./bootstrap.sh AWS
★★★★★ # /donuts
다음과 같이 명령줄 인수로 함수를 호출할 수 있습니다.
function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1
함수를 정의하면 호출할 함수를 인수하기 위해 마지막에 $1을 입력합니다.위의 코드가 fun.sh에 저장되어 있다고 합니다.이제 명령줄에서 ./fun.sh irfan 및 ./fun.sh config 등의 함수를 호출할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8818119/how-can-i-run-a-function-from-a-script-in-command-line
'programing' 카테고리의 다른 글
앱 간의 차이점구성 및 웹.설정? (0) | 2023.04.19 |
---|---|
Unix tail 명령어와 동등한 Windows (0) | 2023.04.19 |
핵심 데이터:엔티티의 모든 인스턴스를 삭제하는 가장 빠른 방법 (0) | 2023.04.19 |
DataReader를 목록으로 쉽게 변환하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
SQL Server 데이터베이스 버전 제어 방법 (0) | 2023.04.19 |