1

えーと..stackoverflowにほぼ同じタイトルの質問がありますが、私の質問とは違います。私のコードはこれです

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 を実行するとすべて正常に動作します。しかし、次のようにスクリプト全体を実行すると:

oracle@sunv440$/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 をスケジュールすることです

4

2 に答える 2

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印刷できないすべての文字を.s(ドット) として印刷します。これらは先頭に (ドット) が
あることに注意してください。.

于 2012-04-30T12:44:57.447 に答える
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

一部のサブディレクトリの名前に空白が含まれていると、これは壊れます。ディレクトリ構造についていくつかの仮定を立てていますが、これは暗示されていますが、テキストでは明確に示されていません。

于 2012-05-07T15:25:17.357 に答える