명령 줄의 스크립트에서 함수를 어떻게 실행할 수 있습니까?


119

몇 가지 기능이있는 스크립트가 있습니다.

명령 줄에서 직접 함수 중 하나를 실행할 수 있습니까?

이 같은?

myScript.sh func()

답변:


66

스크립트가 함수 만 정의하고 다른 작업은 수행하지 않는 경우 먼저 source또는 .명령을 사용하여 현재 셸의 컨텍스트 내에서 스크립트를 실행 한 다음 함수를 호출하기 만하면됩니다. 자세한 내용은를 참조하십시오 help source.


1
이 방법의 유일한 문제점은 exit함수에서 사용 하면 함수가 실행 된 후 터미널을 닫는다는 것입니다. 이 문제를 해결할 방법이 있습니까? @SvenMarnach
user1527227

@ user1527227 : 셸 스크립트를 제어 할 수있는 경우 다음 답변으로 이동합니다. 그렇지 않은 경우 먼저 대화 형 서브 쉘을 호출 할 수 있으며 (입력 만하면 됩니다 bash) exit서브 쉘 만 종료하고 터미널은 종료하지 않습니다.
Sven Marnach 2014 년

238

글쎄, 다른 대답은 옳지 만-확실히 다른 것을 할 수 있습니다. bash 스크립트에 액세스 할 수있는 경우이를 수정할 수 "$@"있으며 명령 줄의 인수로 확장되는 특수 매개 변수를 끝에 배치하기 만하면 됩니다. 사용자가 지정하면 "단독"이므로 쉘은 그대로 호출하려고 시도합니다. 여기에서 함수 이름을 첫 번째 인수로 지정할 수 있습니다. 예:

$ 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

16
"$@"대부분의 경우에 사용합니다 . $@어떤 경우에는 안전하지 않습니다.
fumiyas

1
기능 이상을 실행하는 방법은 무엇입니까? 예를 들어 실행할 수 bash test.sh testA testB있습니까?
Jeff Pang

이것은 또한 [ ! -z "$1" ]그렇지 않으면 소스가 일부 bash 버전에서 else 문을 발생시킬 필요가 있습니다.
JackLeo

파일에서 호출되는 함수를 사용하기 위해이 마법의 "$ @"변수를 멀리서 찾아 봤습니다. 감사합니다 @sdaau!
Justin Hammond

36

다음 명령은 먼저 컨텍스트에 함수를 등록한 다음 호출합니다.

. ./myScript.sh && function_name

1
단순히 소스를 사용할 수도 있습니다. 에서와 같이-소스 myScript.sh && function_name
stolen_leaves

17

간단히 말해서, 아닙니다.

source( help source자세한 내용은) 를 사용하여 스크립트의 모든 함수를 환경으로 가져 와서 호출 할 수 있습니다. 이것은 또한 스크립트를 실행하는 효과가 있으므로주의하십시오.

공유 라이브러리 인 것처럼 쉘 스크립트에서 함수를 호출 할 수있는 방법이 없습니다.


1
나는 이것이 적절한 대답으로 더 많은 가중치를 주어야한다고 생각합니다. 나는 OP가 원하는 것과 비슷한 것을 시도했지만 쉘 스크립팅은 단순히 "깨끗한 OOP 개발"(IMHO)을 위해 설계되지 않았습니다.
Dan L

4

사용 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

이 스크립트는 fun1 및 fun2 함수를 실행하지만 fun1 또는 fun2 옵션으로 시작하면 args (제공된 경우)로 지정된 함수 만 실행되고 종료됩니다. 용법

$ ./test 
run function1
run function2

$ ./test fun2 a b c
run function2
options: a b c

1

편집 : 경고-모든 경우에 작동하지 않지만 많은 공개 스크립트에서 잘 작동합니다.

"control"이라는 bash 스크립트가 있고 그 안에 "build"라는 함수가있는 경우 :

function build() { 
  ... 
}

그런 다음 다음과 같이 호출 할 수 있습니다 (있는 디렉토리에서).

./control build

다른 폴더 안에 있으면 다음과 같이됩니다.

another_folder/control build

파일 이름이 "control.sh"이면 다음과 같이 함수를 호출 할 수 있습니다.

./control.sh build

1
이것은 나를 위해 대화식 셸에서 작동하지 않았습니다. 하지만이 일을 :. ./control.sh && build
saulius2

1

나는 전에 실행해서는 안되는 bash 스크립트의 함수가 필요한 상황이 있는데 (예 :) source문제 @$는 myScript.sh가 두 번 실행된다는 것입니다. sed로 함수를 얻으려면 :

sed -n "/^func ()/,/^}/p" myScript.sh

그리고 필요할 때 실행하기 위해 파일에 넣고 다음을 사용합니다 source.

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh


0

아래와 같이 명령 줄 인수에서 함수를 호출 할 수 있습니다.

function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1

일단 당신이 함수를 끝내면 인수를 받아들이 기 위해 $ 1을 넣으십시오. 위 코드가 fun.sh에 저장되어 function ./fun.sh irfan & ./fun.sh config


0

해결 된 게시물이지만 선호하는 솔루션을 언급하고 싶습니다. 즉, 일반적인 한 줄짜리 스크립트를 정의하십시오 eval_func.sh.

#!/bin/bash
source $1 && shift && "@a"

그런 다음 다음을 통해 스크립트 내에서 함수를 호출합니다.

./eval_func.sh <any script> <any function> <any args>...

내가 받아 들여진 해결책으로 만난 문제는 다른 스크립트 내에서 함수가 포함 된 스크립트를 소싱 할 때 후자의 인수가 전자에 의해 평가되어 오류가 발생한다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.