2012-04-30 11 views
1

Er .. stackoverflow와 거의 같은 제목의 질문이 있지만 내 질문에는 차이가 있습니다. 내 코드는이cd는 bash 스크립트에서 의도 한대로 작동하지 않습니다.

cd /oracle_data/indata/VXMLIVR 
ls -d SMSR > temporary4.txt 
while read smsr_line;do echo $smsr_line;cd $smsr_line;./smsr_alarm;cd ..;done < temporary4.txt 
ls -d SMSC > temporary3.txt 
while read smsc_line;do echo $smsc_line;cd $smsc_line;./smsc_alarm;cd ..;done < temporary3.txt 
ls -d HCIVR5 > temporary.txt 
while read hcivr_line;do echo $hcivr_line;cd $hcivr_line;./hcivr_alarm;cd ..;done < temporary.txt 
ls -d HCIVR6 > temporary.txt 
while read hcivr_line;do echo $hcivr_line;cd $hcivr_line;./hcivr_alarm;cd ..;done < temporary.txt 
ls -d HCIVR7 > temporary.txt 
while read hcivr_line;do echo $hcivr_line;cd $hcivr_line;./hcivr_alarm;cd ..;done < temporary.txt 
ls -d HCIVR8 > temporary.txt 
while read hcivr_line;do echo $hcivr_line;cd $hcivr_line;./hcivr_alarm;cd ..;done < temporary.txt 
ls -d IVR* > temporary2.txt 
while read ivr_line;do echo $ivr_line;cd $ivr_line;./ivr_alarm;cd ..;done < temporary2.txt 
rm temp* 

이 스크립트를 vas_alarm으로 저장했습니다. 첫 번째 줄 (cd/oracle_data/indata/VXMLIVR)을 제거하면 수동으로 cd/oracle_data/indata/VXMLIVR을 실행하고 ./vas_alarms를 실행하면 모든 것이 정상적으로 작동합니다. 하지만 다음과 같이 전체 스크립트를 실행하면

[email protected]$/oracle_data/indata/VXMLIVR/vas_alarms 
: No such file or directory/vas_alarms: line 1: cd: /oracle_data/indata/VXMLIVR 

메신저 오류가 발생합니다. 내가 어디로 잘못 가고 있니? 문제는 내 스크립트가/oracle_data/indata/VXMLIVR에 저장되어 있으며이 위치를 입력 한 후에 스크립트를 실행해야한다는 것입니다. 또한 스크립트는 cron 파일에 저장해야합니다. 모든 문제 해결 방법도 있습니다. 내 주요 목표는/oracle_data/indata/VXMLIVR/vas_alarms를 예약하는 것입니다.

+3

파일에 펑키 문자가있는 것 같습니다. 'hexdump -C'를 통과 시켜서 이상한 것을 발견 할 수 있는지 확인하십시오 (또는'od -x') – Mat

답변

3

파일에 보이지 않는 문자가있는 경우 발생합니다. 예를 들어

:

$ echo $'\rhello' | xxd 
0000000: 0d68 656c 6c6f 0a      .hello. 

xxd.의 (점) 모든 인쇄 할 수없는 charactors을 인쇄합니다 :

$ touch hello 

$ echo $'\rhello' 
hello 

$ ls $'\rhello' 
hello: No such file or directory 

당신은 xxd/hexdump/od 바이너리 프레젠테이션을 볼 수 있습니다.
처음에는 . (점)입니다.

+0

틀린 문자가 거기 있습니다^M. vi로 열어서 고쳤습니다. 감사합니다 – user1356163

+0

다음이 답변을 허용으로 표시하십시오. – tripleee

1

몇 가지 의견이 있지만 주석 기능은 코드 스 니펫을 지원하지 않으므로 답변으로 게시하고 있습니다.

코드에서 실제로 일부 리팩터링을 사용할 수 있습니다. 반복적 인 코드는 피해야하며 임시 파일을 피해야합니다. ls의 출력 구문 분석은 피해야합니다. 때로는 임시 파일을 덮어 쓰는 경우가 있습니다.

cd ..은 기호 링크가 관련되어있을 때 다소 취약합니다. 일반적인 관용구는 보조 셸에서 cd을 수행하는 것이므로 부모 셸이 현재 디렉토리에 남아있게됩니다.

그렇다면 리팩토링에 대한 나의 시도입니다.

#!/bin/sh 

cd /oracle_data/indata/VMXLIVR 

while read cmd dirs; do 
    for dir in $dirs; do 
     for subdir in $dir/*/.; do 
      echo "$subdir" 
      (cd "$subdir"; ./"$cmd";) 
     done 
    done 
done <<HERE 
    smsr_alarm SMSR 
    smsc_alarm SMSC 
    hcivr_alarm HCIVR[5678] 
    ivr_alarm IVR*   
HERE 

일부 하위 디렉토리의 이름에 공백이 있으면 깨집니다. 나는 묵시적이지만 귀하의 본문에서 명확하게 증명되지 않은 디렉토리 구조에 대해 몇 가지 가정을하고 있습니다.

관련 문제