2011-12-22 5 views
0

root로 스크립트를 실행하고 있고 oracle 사용자가 정의되어 있는지 확인하려고합니다. 여기 내 대본이 있습니다 :

su - $user << EOF 2>&1 
    if [ -n "${ORACLE_HOME:+x}" ] 
    then 
     echo "KO" > /tmp/oracle.tmp 
    else 
     echo "$ORACLE_HOME" > /tmp/oracle.tmp 
    fi 
EOF 

이 작업이 없습니다. 그것은 나를 if: Expression Syntax.주고 파일이 만들어지지 않습니다. 나는 문제가 su 캡슐화와 같다고 생각하기 때문에 if 명령문 만 실행하면 작동합니다. 어떤 생각?

그리고 내가 왜 루트로 실행 중인지 묻지 마십시오. 나는 나쁜 행동을 알고 있지만 그것에 대해 할 수있는 일은 아무것도 없다.

+0

왜 그냥 : $ 에코 {ORACLE_HOME : -ko}> /tmp/oracle.tmp 르) 문제에 주어진 샘플 코드 않는 한

당신은 다만 수, 단순화인가? –

답변

1

코드는 bash에서는 실행되지 않지만 sh에서는 대체 값 구문을 지원하지 않습니다.

+0

그래서 모든 셸에서 실행될 수 있도록 최대한 일반화하기위한 제안이 있습니까? – Michael

+0

글쎄, 당신은 [-n "$ ORACLE_HOME"]으로 대체 할 수 있습니다 (어쨌든 여기서 대체 값이 필요한 이유는 무엇입니까?) 또는 bash에서 코드를 실행하십시오. – choroba

+0

변수가 oracle 사용자로 설정되었는지 확인하고 싶습니다. 문제는 내가 셸 오라클 사용자가 실행 중인지에 대한 제어권이 없다는 것입니다. 그래서 전환 할 때 내 명령이 가능한 한 일반화되어야합니다. 나는 대체 값이 무엇인지 모르겠다. 나는 쉘 스크립팅의 초보자이다 ... 나는 당신이 감사하다고 말한 것을 시도 할 것이다. – Michael

0

문제는 따옴표가 히어 닥를 분석 쉘에 의해 제거, 그래서 실행되는 코드가지고 있다는 것입니다 :

 
if [ -n ] 

당신은 히어 닥에서 문자열 보간을 피하려고, 그 문제를 제거하기 위해 어떤 당신이 분리 문자 인용으로 수행 할 수 있습니다 물론

 
su - $user << 'EOF' 2>&1 

, 보간되는 ORACLE_HOME을 방지 할 수 있으므로 ORACLE_HOME 환경 (즉 인 경우에만 동작합니다, 그것은 쉘 변수가 아니라이 수출되었고 환경 variab입니다 .

 
echo ${ORACLE_HOME:-KO} > /tmp/oracle.tmp 
관련 문제