bash 함수를 호출하는 방법


28

어쩌면 나는 이것을 잘못된 길로보고있을 것이다. 그러나 여기서 나는 내가하고 싶은 일을한다. Java로 대부분의 작업을 수행하지만 유닉스 (bash) 환경으로 전환했습니다. 나는 이것을하고있다 :

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

그러나 파일에 두 가지 기능이 있으며 명령 줄과 별도로 호출 할 수 있기를 원합니다. 즉 : myFunc.ls2()또는 심지어 ls2. 나는 내 .bashrc파일에 함수를 추가 할 수 있지만 내 함수를 추가하지 않고이 함수를 실행할 수있는 다른 방법이 .bashrc있습니까?

답변:


25

이 작업을 수행하는 한 가지 방법은 조금 더 타이핑하는 것과 관련이 있으며 source명령을 사용하는 것입니다. myFunc에서 함수를 호출하려면 사용할 수 있으며 source myFunc; ls2Hello World를 출력합니다.

예를 들어 다음과 같은 파일이 있습니다 say.sh.

#!/bin/bash

function talk()
{
        echo "hi!"
}

이제 talk()명령 줄 에서 함수 를 호출하고 싶습니다 .

[john @ awesome ~] $ 소스 say.sh; 이야기
안녕!

다른 bash 스크립트에서 호출하려면

#!/bin/bash
source say.sh
talk

각각을 별도의 스크립트에 넣고 PATH 변수에있는 디렉토리에 추가 할 수도 있습니다.

예를 들어, 하나의 스크립트에는 hello다음이 있습니다.

#!/bin/bash
echo "Hello World"

이제 이것을 PATH의 디렉토리 중 하나에 넣으십시오 echo $PATH. 기존 디렉토리를 사용하거나 사용하려는 경우 PATH에 다른 디렉토리를 추가 할 수 있습니다. 파일을 복사 한 후로 실행 파일을 만드십시오 chmod +x filename.


3
명확하게 : 스크립트 또는 셸 시작마다 파일을 한 번만 소스하면됩니다. 소스 파일을 다시 참조하지 않고 그 후 원하는 횟수만큼 함수를 호출 할 수 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

5

또 다른 방법은 functions.sh( ~/bin예를 들어 디렉토리에) 라는 스크립트를 작성하는 것 입니다.

이 스크립트에서는 모든 개인 함수 정의를 추가합니다 (함수를 추가 할 때마다이 파일에 추가합니다 ...).

마지막으로 파일에 source ~/bin/functions.sh줄을 추가하면 .bashrc됩니다. 이런 식으로 명령 행에서 전화를 걸 수 .bashrc있고 깨끗하게 유지되며 개인 기능을위한 특정 장소를 갖게됩니다.


5

당신이 나와 같다면, 당신의 기능으로 환경을 어지럽히고 싶지 않습니다. 또한 기능 측면에서 함께 속한 기능 그룹이 있으므로 동일한 스크립트 파일에 넣는 것이 좋습니다. (여러 파일이있는 폴더는 같은 목적으로 사용될 수 있음을 알고 있습니다). 다음은 스크립트에서 특정 함수를 호출 할 수있는 가능한 솔루션입니다.

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

나는 source두 개의 다른 sh 파일에서 같은 이름의 두 가지 기능을 가질 수 있기 때문에 이것을 훨씬 더 좋아 합니다. 다음 $1 $2 $3 $4 $5과 같이 대체하여 임의의 수의 매개 변수를 처리하도록 수정했습니다.FUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur : 왜 농구를 뛰어 넘는가? 마지막 줄을로 변경하십시오 "$@". 추신 당신의 접근 방식은 실제로 잘못되었습니다. 마지막 부분이되어야한다 "$FUNC_CALL" "$@"  (즉,  $FUNC_CALL따옴표로해야한다).
Scott

무엇입니까 "$FUNC_CALL"?
ctrl-alt-delor

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