2017-11-29 46 views
1

SSH를 사용하여 원격으로 명령을 실행하려고하지만 EOF에서 정의 된 변수가 선택되지 않습니다.변수가 EOF 내부에서 선택되지 않음

변수 $BASE_PATH은 내가 이름으로 정의한 다른 변수 내에서 호출되지 않습니다. FOLDER_NAME. 스크립트 내부에서도 언급되었습니다. 작은 따옴표로 EOF을 사용할 수 없습니다 ('EOF'). 쉘을 종료 할 때도 변수를 사용해야하므로 사용할 수 없습니다. 달러 기호가 내 특별 그래서 탈출하지 않는 한

#!/usr/bin/ksh 

FILE_NAME=$2 
jvm_list=$1 

for jvm in `echo $jvm_list` 
do 

ssh $jvm << EOF 
    echo FILE_NAME=${FILE_NAME} 
    export BASE_PATH="\${WEB_DOMAIN_HOME}/Server"; 
    echo BASE_PATH=\${BASE_PATH};   ##Value of BASE_PATH is getting picked up## 
    export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* | grep -i -v old\` ##Value of BASE_PATH is coming blank here## 
    echo $FOLDER_NAME 
EOF 

done 

답변

1

는 구조는 이중 인용 된 문자열과 같은 << EOF 행위를 시작했다. 여기

, 당신은 $ 탈출, 그래서 결국 ssh에 의해 시작 쉘은 평가가 외부 쉘에서 일어나는, 그래서 여기에 변수

echo BASE_PATH=\${BASE_PATH}; ##Value of BASE_PATH is getting picked up## 

, 당신은 그것을 탈출하지 않았다 평가 :

export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* ...\` 

또한 인용 부호가 잘못 배치 된 것으로 의심됩니다. Bash에서 $".."is a locale-specific translationseems to be the same in ksh. 아마 번역이 없으므로 문자열은 그대로 다시 와야합니다 : {BASE_PATH}.

인용 부호가 필요하므로 다소 관련이 있습니다. $(...) 명령 대체 형식을 사용할 수 있으므로 $에 대해서만 생각하면됩니다.

나는이 당신이 원하는 것 같아요 :

ssh "$jvm" << EOF 
    export FOLDER_NAME=\$(ls -1d "\${BASE_PATH}"/properties* | grep -i -v old) 
EOF 

전성 검사 :

$ foo=out; bash <<EOF 
> foo=in; echo $foo 
> EOF 
out 

$ foo=out; bash <<EOF 
> foo=in; echo \$foo 
> EOF 
in      
+0

감사합니다. 나는 당신이 말한 것과 똑같은 코드를 넣으려고했으나 효과가 없다. FOLDER_NAME에서 $ BASE_PATH의 값이 비어 있습니다. 오류 : - ls : 0653-341 파일/속성 *이 없습니다. –

+0

@manavsharma, argh, facepalm, 거기에 추가 된 정확한 백 슬래시를 놓쳤습니다. 따라서'$ {var}'는 외부 쉘 (메인 스크립트)의 값을,'\ $ {var}'은 (ssh의) 내부 쉘의 값을 제공합니다. – ilkkachu

+0

@kkachu, 마침내 효과가있었습니다. :) 고마워. –