cd在bash脚本中没有按预期工作

时间:2012-04-30 12:27:53

标签: bash unix cron cd

呃..在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

2 个答案:

答案 0 :(得分: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(点)。
请注意,这些是开头的.(点)。

答案 1 :(得分: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

如果某些子目录的名称中包含空格,则会中断。我正在对目录结构做一些假设,这些假设是隐含的,但在文中没有清楚地说明。