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//查看二进制表示hexdumpod

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

xxd将所有不可打印的字符打印为.s(点)。
请注意,这些是.开头的(点)。

于 2012-04-30T12:44:57.447 回答
1

我有一些评论,但由于评论工具不支持代码片段,我将其发布为答案。

您的代码确实可以使用一些重构。您应该避免重复代码,并且应该避免使用临时文件。您应该避免解析ls. 您有时会覆盖临时文件,有时不会。

cd ..涉及符号链接时有点脆弱。一个常见的习惯用法是cd在子shell 中做,这将导致父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

如果某些子目录的名称中包含空格,这将中断。我正在对目录结构做出一些假设,这些假设在您的文本中隐含但没有清楚地展示。

于 2012-05-07T15:25:17.357 回答