2012-04-30 22 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. S(ドット)として、すべての印刷できないキャラが印刷されます:

$ 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 

サブディレクトリの一部に名前に空白が含まれていると、これが破損します。私は暗黙のうちにあなたのテキストで明確に示されていないディレクトリ構造についていくつかの仮定をしています。

関連する問題