2016-05-01 4 views
0

私は、シェルスクリプトmakecsv.shが正しく動作しますが、Perlから呼び出されると失敗します。Perl内から動作中のシェルスクリプトを実行できません

これは私がPerlスクリプトからmakecsv.shを実行したときに、それが与えるメッセージです:

fr call 
Source file does not exist 

Usage: fr -s <source_file> -o <output_file> 
    -s <source_file> - Input file which has Counter Information 
    -o <output_file> - Comma separated output file 

third move 
mv: cannot access /home/ateam/.../SAM5_01-05- 2016_11:07:29.csv 
/home/ateam/.../SAM5_01-05-2016_11:07:29.xcm: No such file or directory 
cp: cannot access /home/ateam/.../SAMlog/ /home/ateam/.../SAM5_01-05-2016_11:07:29.csv 
md5sum: /home/ateam/.../SAM5_01-05-2016_11:07:29.csv: No such file or directory 
/home/ateam/.../SAM5_01-05-2016_11:07:29.csv: No such file or directory 

これは私が何このことを理解していないfrノード

drwxrwxr-x 4 ateam ateam  4096 May 1 11:12 ./ 
drwxr-xr-x 3 ateam ateam  4096 Mar 17 11:18 ../ 
lrwxrwxrwx 1 ateam ateam   7 Mar 12 19:13 c -> counter* 
-rwxrwxr-x 1 ateam ateam  1974 Mar 12 19:04 counter* 
-rwxrwxr-x 1 ateam ateam  134 Mar 21 11:22 e* 
-rw-rw-r-- 1 ateam ateam 25152020 Mar 21 11:22 enb 
-rw-rw-r-- 1 ateam ateam 1880872 Mar 21 11:21 enb283.xml 
-rwxrwxr-x 1 ateam ateam  811 Mar 28 11:59 expftp* 
lrwxrwxrwx 1 ateam ateam   7 Mar 17 11:23 fr -> fruinfo* 
-rw-rw-r-- 1 ateam ateam  75753 Mar 22 13:07 fru_0322.xls 
-rwxrwxr-x 1 ateam ateam  2878 Apr 21 22:16 fruinfo* 
drwxrwxr-x 2 ateam ateam  4096 May 1 11:12 md5sum/ 
... 

を含むディレクトリのリストですディレクトリ項目は

lrwxrwxrwx 1 ateam ateam   7 Mar 17 11:23 fr -> fruinfo* 



もう少し詳しい情報。

シェルスクリプトでは、frへの呼び出しは、この

fr -s "$newfile" -o "$frufile" 

のように見え、シェバング行はPerlのファイルで、この

#!/bin/bash 

で、シェルスクリプトがこの

のように呼ばれています
my $cmd = qq(bash makecsv.sh $initdir$sam.xcm $csvdest); 
print $cmd, "\n"; 
#system 'bash makecsv.sh ${initdir}${sam}.xcm $csvdest'; 
system($cmd); 

上記の変数はすべて引用符で囲まれています。

+0

Btwでは、makecsv.shとperlスクリプトは同じディレクトリにあります。上記のfrファイルのリストは、別のディレクトリにあります。 –

+1

'makecsv.sh'の' fr'呼び出しの直前に 'echo" DEBUG:newfile:$ newfile "を追加し、シェルやPerlスクリプトから' makecsv.sh'を実行したときに表示されるものを見てください。 – bart

+0

私はそれを試みます。 fruinfoとcounterファイルがfrとcの部分で何をしているのか知っていますか? –

答えて

0

Perlスクリプトの中でこのシステムコールが呼び出されたとき、私は$ initdir変数を不必要に追加していました。

my $cmd = qq(bash makecsv.sh $initdir$sam.xcm $csvdest); 
print $cmd, "\n"; 
system($cmd); 

は、私はこれに$ CMDを初期化する行を変更し、それが働いた:
my $cmd = qq(bash makecsv.sh $sam.xcm $csvdest); 

が今どのように見えるかmakecsv.sh用として、プログラムは次のようになります。ディレクトリを意図的に短縮しました。

#!/bin/bash 
#/bin/env sh 
# makecsv.sh /path/to/source/ /path/to/destination/ 

SRC=$1 
DST=$2 

# separate filename from ext 
filename="${SRC%.*}" 
extension="${SRC##*.}" 

NOW="$(date +'%d-%m-%Y_%T')" 
newfile="${filename}_${NOW}.$extension" 

mv -f "$SRC" "$newfile" 
mv -f "$newfile" "$DST" 
#mv -f "${filename}_${NOW}.$extension" "$DST" 

cd $DST 
# rename file with .csv ext (without the .xcm) 
noExt="${newfile%.*}" 
frufile="${noExt}.csv" 
fr -s "$newfile" -o "$frufile" 

mv "$frufile" "/home/.../SAMlog" 
rm "$newfile" 

# remove files older than 90 days 
find /home/..../SAMlog -type f -mtime +90 -exec rm {} \; 

# create a md5sum stored in a file for frufile 
cp /home/.../SAMlog/"$frufile" "${DST}/md5sum" 
cd "${DST}/md5sum" 
# create a fingerprint for the new frufile 
md5file="${noExt}.md5" 
touch "$md5file" 
md5sum "$frufile" > "$md5file" 
rm "$frufile" 

# check for md5sum files older than 1 day and delete them 
# only ever need to keep the sums of the current day and the previous one for cmp 
find /home/.../md5sum -type f -mtime +1 -exec rm {} \; 

このコードはフルパスを受け入れることは決してありませんでしたが、私はトップに書いておきます。だから、私はフルパスを受け入れるように変更します。