2012-08-31 10 views
4

예를 들어, rsync으로 백업을 백업하는 bash 쉘 스크립트를 작성하고 싶습니다. 독립 실행 형 스크립트 파일 (backup.sh)으로 넣거나 함수 (backup)로 묶어야합니까? 스크립트 파일로 실행할 수 있습니다. bash backup.sh. 함수로, foo.sh과 같은 파일에 넣고 로그인 할 때마다 소스를 넣을 수 있습니다. 그러면 내 파일을 백업하는 명령으로 backup을 간단하게 실행할 수 있습니다. 문제는 두 가지 전략에 대한 단점과 찬성은 무엇인가?독립 실행 형 셸 스크립트 대 셸 함수?

더 일반적으로, 어떤 상황에서 독립 실행 형 셸 스크립트 파일 또는 셸 함수로 기능을 구현해야합니까?

내 생각 : 일부 그래픽 세션 (예 : KDE, Gnome 등)은 로그인 할 때 다른 파일을 소스 화합니다. 그래픽으로 실행되는 응용 프로그램에서 셸 기능을 사용하려는 경우 (예 : 아이콘을 클릭하여 이맥을 여는 경우) 혼란을 야기 할 수 있습니다. 그러나 필자는 셸 함수를 구현하여 파일로 결합하는 것을 선호합니다. 이것은 깔끔하고 잘 정리 된 것입니다.

다른 아이디어 나 제안이 있으십니까?

답변

4

자주 사용하려는 기능을 사용하십시오. 그들은 메모리를 차지하고 쉘을 시작할 때 파싱을 요구합니다. 파싱은 결코 사용하지 않으면 낭비됩니다.

오랜 시간이 걸리는 작업에는 스크립트를 사용하십시오. 호출 당 파싱 (parsing) 시간은 무시해도 좋고 스크립트를 분리하면 선명도가 향상됩니다.

백업 스크립트의 경우 함수가 아닌 스크립트를 사용하는 것이 좋습니다.

+0

기준은 나에게 매우 모호하게 보입니다. 나는 스크립트가 가져 오는 명확성을 정말로 보지 못한다. 함수가 취하는 자원은 종종 소홀히합니다. 그렇지 않습니까? – RNA

+1

그들은 다소 모호하지만, 한 시간에 한 번 이상 코드를 사용하지 않으면 스크립트에 속합니다. 나는 그것보다 훨씬 자주 사용하는 것에 스크립트를 사용한다. 사실, 나는 쉘에 두 가지 기능을 가지고 있는데 그 중 하나는 IT 제공'/ etc/profile'의 버그 때문이다. (버그 :'unset pathmunge'는 함수를 제거하지 않는다; 'unset -f pathmunge'), 그리고 나는 다른 것을 만들지도 않았다. 나는 아직 그 기원을 추적하지 못했다. 나는 항상 스크립트를 사용한다. 내 $ HOME/bin에 수백 가지가 있습니다. [... 계속 ...] –

+0

[... 계속 ...] 나를 틀리게하지 마십시오; 기능을 사용할 때가 있습니다. 많은 스크립트에는 스크립트를 작성하기가 더 쉽기 때문에 함수가 포함되어 있습니다. 하지만 주요 로그인 쉘 환경에서 기능을 많이 사용하지는 않습니다. –

1

파이썬과 같은 솔루션 :

#!/bin/bash 

caller_shlvl=$1 
shift 

backup() { 
    ... 
} 

if (($caller_shlvl < $SHLVL)); then 
    backup "[email protected]" 
fi 

당신이 할 수있는 두 가지 중 하나를 스크립트 호출 할 때

bash script.sh $SHLVL other args 

백업을 실행하기 위해, 또는

source script.sh $SHLVL 
# Time passes 
backup firstarg secondarg etc 

현재 셸에서 함수를 정의하지만 실행하지는 않습니다.

가 (명시 적 첫 번째 인수로 SHLVL을 $ 전달할 수있는 것은 내가 시뮬레이션으로 얻을 수있는 가장 가까운 파이썬의

if __name__=="__main__": 

그것은 꽤, 아마도 그다지 유용하지이 대답을하게되지.)