2012-04-30 74 views
1

呃..有一個問題,在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

當文件中有一些不可見的字符時會發生這種情況。

例如:

$ touch hello 

$ echo $'\rhello' 
hello 

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

您可以使用xxd/hexdump/od查看二進制介紹:

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

xxd將打印所有的不可charactors爲. S(點)。
請注意,這些是開頭的.(點)。

+0

是不正確的字符在那裏^ M。用vi打開並修復它。謝謝 – user1356163

+0

請將此答案標記爲已接受。 – tripleee

1

我有一些評論,但由於評論設施不支持代碼片段,我發佈這個答案。

你的代碼真的可以使用一些重構。你應該避免重複的代碼,你應該避免臨時文件。您應該避免分析ls的輸出。有時您會覆蓋臨時文件,有時不會。

cd ..在涉及符號鏈接時有些脆弱。一個常見的習慣用法是在子shell中執行cd,這將導致父shell保留在當前目錄中。

因此,這裏是我的重構嘗試;

#!/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 

如果某些子目錄的名稱中包含空格,則會中斷。我正在對目錄結構做出一些假設,這些假設是隱含的,但在您的文本中沒有清楚地表明。