呃..在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
答案 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
如果某些子目录的名称中包含空格,则会中断。我正在对目录结构做一些假设,这些假设是隐含的,但在文中没有清楚地说明。