2016-08-17 4 views
0

매개 변수를 Bash 쉘에서 실행 파일로 전달하기위한 다음 대체 방법이 있습니다. 나는 첫 번째 방법이 현재 더 일반적이라고 생각한다.환경 변수를 사용하여 매개 변수 전달의 단점

방법 1은 -

arg1=1 ./myprogram 

때 어떤 문제가 발생할 수있는 환경 변수마다 호출로 전달할 파라미터 - 명령어 라인 인수로

./myprogram --arg1 1 

방법 2을 변수를 전달 두 번째 방법을 사용합니까?

이 밀접하게 관련 질문 (Argument passing strategy - environment variables vs. command line)이 아니라 내가 관심 오전 직접 당 호출 사용보다 환경 변수의보다 광범위한 사용을 해결한다.

+2

문제 없음, 정말. 두 개는 서로 바꿔 쓸 수 없습니다. 당신의 스크립트는 그 중 하나를 받아들이도록 정확하게 쓰여 져야합니다. 명령 행 옵션과 비교되는 환경 변수의 유일한 단점은 쉘에서 환경 변수를 설정하고 잊어 버릴 수 있다는 것입니다. 프로그램이 어떻게 설정되었는지 알지 못하거나 신경 쓰지 않을 것이고,'./myprogram'이 뜻밖에 'arg1 = 1./myprogram'과 똑같이 동작 할 때 머리를 찰 수 있습니다. 실수로 호출에 명령 행 옵션을 추가하는 것이 더 어렵습니다. – chepner

답변

3

첫 번째 방법은 다른 사람이 그렇게 쉽게 일반적이다 알다.

환경 변수가 사용되는 경우 ($ ORACLE_HOME, $ JAVA, ..) 명령 줄에는 설정되지 않지만 다른 스크립트에 의해 사용되기 전에 사용됩니다. 따라서 var가 환경 변수의 일부가되어야한다고 생각하면 환경 변수 (기본값)를 사용하는 것이 좋습니다.
다른 경우에는 매개 변수를 사용합니다.

어떻게 스크립트 modifing에 대한 :

# First script calling myprogram that uses ... 
# Difficult to see, the vars name and lastname 
name="John" 
while read -r lastname; do 
    ./myprogram 
done < lastnames.txt 

이제 다른 사람이 데이터베이스에서 환경 변수 이름으로 모든 사용자를 루프를 변경하고 싶어합니다.

name="John" 
while read -r lastname; do 
    ./myprogram 
    username="${lastname}" ~/bin/getdbusers 
done < lastnames.txt 

당신이 운이 이번에는 두 번째 사람은 또한 VAR username를 사용하고 ./myprogramlastname를 사용한다는 사실을 인식하지 못합니다. 그는 루프 변수를 변경하여 버그를 도입하려는 유혹을 받고 있습니다. 어떤 프로그램이 $ name 및 다른 변수를 사용하는지 이해하기가 어려워졌습니다.
사용하여 매개 변수를 쉽게 이해할 수 있도록하고 버그를 멀리 유지하지 :

name="John" 
while read -r lastname; do 
    ./myprogram "${name}" "${lastname}" 
    ~/bin/getdbusers "${lastname}" 
    ~/bin/somethingWithUserName "${lastname}" 
done < lastnames.txt 
+0

+1 일반적으로 환경 변수 사용에 대한 좋은 참고 사항이지만 경고하는 버그 유형을 소개하는 것이 더 어려울 것이라고 생각되는 명시 적 호출 별 사용 양식에 대해 구체적으로 묻고있었습니다. 당신이 묘사하는 것처럼 암묵적으로 변수를 사용하려는 유혹을 볼 수 있습니다. 하지만이 스 니펫이 작동하려면 아마'export' 문이 필요합니다. 이렇게하면 쉽게 속임수를 쓰게 될지도 모릅니다. – nobar

관련 문제