2011-04-19 4 views
2

스크립트 파일에서 변수 정의를 다른 여러 줄의 코드와 함께 이동 시켰을 때 개발 서버에서 자동 빌드에 사용하는 일부 셸 스크립트를 유지 관리하고있었습니다. 그 결과,이 라인 :rm -rf 문에서 환경 변수를 사용하는 것은 나쁜 습관입니까?

WEB=/home/server/web 

는 다른 스크립트 파일에 해당 스크립트 파일에서 이동되지있어, 첫 번째 스크립트 파일에 의해 사용되는 환경에서 더 이상이었다. 이 방법 나쁜 실제로 환경 변수를 사용하여, rm -rf /*

내 질문은 고려할 것 또는 유해한 것으로 간주 : 따라서, 나중에 파일,

rm -rf $WEB/* 

는 리눅스 사용자의 무시 무시한 명령에 평가되었다? 고전

변수 선언을 제거하는 의미를 즉시 명확하지 않고, 선 아래로 놀라운 일이 될 수
if (foo) 
    bar() 
    bar2() 

같은 뭔가? 아니면 이런 일을 할 때 좀 더주의해야합니까?

+0

나만의 것 : 당신이/문자를 넣는 곳을 조심한다면 해를 입을 가능성을 줄일 수 있습니다. 예 : 'WEB =/home/server/web /'그리고 나서'rm -rf $ WEB'. 이것은 엄격하게 동일하지는 않지만 대부분의 의도와 목적을위한 것입니다. 따라서 $ WEB가 우연히 설정되지 않으면 rm 명령은 * nothing *을 수행하므로 모든 것을 제거하는 것보다 훨씬 낫습니다. – crazy2be

답변

0

나는 (더 $) 할당이 사실이라고 가정하지 :

WEB=/home/server/web 

이이 스크립트로 작성된 경우,이 환경 변수 아니었다 rm -fr $WEB/*을 포함하여 적절한 방식으로 사용하는 것이 정당합니다.

할당이 스크립트에 없었다, 또는 단지 스크립트에 디폴트 경우

은, 그것은 더 위험하지만 여전히 그것을 사용하는 것이 합법적 :

: ${WEB:=/home/server/web} 

rm -fr $WEB/* 

이 '의미 경우 환경 변수 $WEB 비어 있지 않은 값으로 설정되면 사용하십시오. 그렇지 않으면 값 /home/server/web '을 사용하십시오. 이 $WEB 값은 특히 root이 스크립트를 실행하는 경우 정상 성을 검사해야합니다. $WEB 값의 뒤에 공백이 있으면 의도하지 않은 혼란을 야기 할 수 있습니다.

그러나 판결 전화가됩니다. 나는 아마 그것을하지 않을 것이다; 물건을 제거하는 데 사용 된 환경 변수는 우발적이거나 고의적 인 남용에 너무 취약합니다. 아마도 스크립트에 인수로 전달 된 값을 요구할 것입니다. 그러나 형식적으로 환경 변수를 사용하는 것은 잘못된 것이 아닙니다. 그것은 약간 위험합니다. 좋은 백업이 있다면 위험하지는 않지만 환경에 WEB=/을 조심하십시오!

2

내가 정말 "나쁜 연습"이다하지만 난 그 언제 당신이 그것을 위험과 가공있어 스크립트의 RM은 -rf하고있어 말할 것이다 말할 수

일반적으로 내가 무엇을 할 거 야 만드는 것입니다)/tmp/todelete라는 디렉토리에 mv 스크립트를 실행하는 동안 삭제할 모든 데이터를 mv로 복사 한 다음 cron 작업을 통해 매 2 시간마다 해당 디렉토리를 지우십시오. 그런 식으로 무언가가 엉망이되면 데이터가 실제로 삭제되기 전에 잡을 시간이 있습니다.변수가 값이 (방어 프로그램)

환경 변수를 사용하여 일반적으로

#!/bin/bash 

#WEB= 
WEB=/home/server/web 

if [ -z "${WEB+X}" ] 
then 
    echo "\$WEB is unset" 
elif [ -z "$WEB" ] 
then 
    echo "\$WEB is set but empty" 
else 
    echo "The value of \$WEB is $WEB" 
    rm -rf $WEB/* 
fi 
+0

흥미로운 방법입니다. 특히 mv 작업은 일반적으로 저렴하기 때문에 (물리적 드라이브를 거치지 않는 한) 일반적으로 저렴합니다. 휴지통이나 쓰레기 같은 것. – crazy2be

+1

s/가공/[fraught] (http://www.oed.com/view/Entry/74315)/|| die – tchrist

0

확인하는 것이 좋습니다 수 있습니다,하지만 당신은 발견 한로 그들은 특정 장소에서 매우 위험 할 수 있습니다. 다른 위험 요소 중 하나는 변수를 설정/확인하는 것을 잊어 버리면 변수가 다른 프로그램에 의해 쉘에서 임의로 설정 될 수 있다는 것입니다.

그러나 bash와 같은 쉘을 사용하여 환경 변수를 설정해야합니다. "위험한"장소 (rm, chmod, chown, ...)에서 피할 수 있다면 훨씬 더 좋습니다. 일반적으로 가장 좋은 방법은 물건을 옮길 때 rm과 같은 명령을 사용할 때보다 신중해야한다는 것입니다.

+0

음, 변수는 원래 같은 스크립트 내에서 설정되었으므로 과장된 것 같습니다 : P. – crazy2be

+0

동의 함. sudo rm -rf와 같은 중요한 작업을 확인하는 것이 좋습니다. 'ls $ WEB'에 대한 과잉 행동 일 수도 있습니다. :) – spockaroo

0

예를 들어 설정 약간 위험 한 경우

+0

특히'-r'과'-f' 스위치가 관련되어있을 때,주의는 항상'rm' 명령을 사용하는 것이 좋습니다 : P. – crazy2be

관련 문제