user2094311
user2094311

Reputation:

csh script - Redirect block of commands to file

I searched in Google a lot, but couldn't find.

I have a csh script to create a file. There are many echo commands which I want to redirect to a file.

I don't want to redirect to the file in each echo command. Is there any way we can make it block and write to file in single command.

Here is my script

myscript.sh

#!/bin/csh

set file_dir="/home/user/somedir"
set output_file="/home/user/outputdir/details.txt"

#Block Starts Here
echo "Write Something"
echo "Some content goes here"
echo "Dir : $file_dir"
echo "Destination : $output_file"
echo "Generated at : `date`"

foreach file ( `ls $file_dir` )
    set file_name="$file_dir""/""$file"
    set cksum=`cksum $file_name`
    set md5=`md5sum $file_name`
    set checksum=`echo $cksum | awk -F' ' '{$NF=""; print $0}'`
    set md5sum=`echo $md5 | awk -F' ' '{$NF=""; print $0}'`
    echo "#### START ####"
    echo "File Name : $file"
    echo "Checksum : $checksum"
    echo "MD5Sum : $md5sum"
    echo "#### END ####"
end 
# Block Ends Here

Upvotes: 0

Views: 569

Answers (1)

Sampisa
Sampisa

Reputation: 1583

You cannot. foreach - for csh - is internal command, so it can't be redirected.

This is what I suggest:

myscript.csh

#!/bin/csh

set file_dir="/tmp"
set output_file="/tmp/details.txt"

#Block Starts Here
echo "Write Something"
echo "Some content goes here"
echo "Dir : $file_dir"
echo "Destination : $output_file"
echo "Generated at : `date`"

foreach file ( `ls $file_dir` )
    set file_name="$file_dir""/""$file"
    set cksum=`cksum $file_name`
    set md5=`md5sum $file_name`
    set checksum=`echo $cksum | awk -F' ' '{$NF=""; print $0}'`
    set md5sum=`echo $md5 | awk -F' ' '{$NF=""; print $0}'`
    csh logger.csh $file $checksum $md5sum >> $output_file
end
# Block Ends Here

Then add the following

logger.csh

#!/bin/csh
echo "#### START ####"
echo "File Name : $1"
echo "Checksum : $2"
echo "MD5Sum : $3"
echo "#### END ####"

If you want to redirect errors too, include whole foreach in another .csh script then redirect output to /dev/null


Alternatively:

myscript.csh

#!/bin/csh
set file_dir="/tmp"
set output_file="/tmp/details.txt"
csh block.csh $file_dir $output_file > $output_file >& /dev/null

block.csh

#!/bin/csh
set file_dir=$1
set output_file=$2
#Block Starts Here
echo "Write Something"
echo "Some content goes here"
echo "Dir : $file_dir"
echo "Destination : $output_file"
echo "Generated at : `date`"

foreach file ( `ls $file_dir` )
    set file_name="$file_dir""/""$file"
    set cksum=`cksum $file_name`
    set md5=`md5sum $file_name`
    set checksum=`echo $cksum | awk -F' ' '{$NF=""; print $0}'`
    set md5sum=`echo $md5 | awk -F' ' '{$NF=""; print $0}'`
    echo "#### START ####"
    echo "File Name : $file"
    echo "Checksum : $checksum"
    echo "MD5Sum : $md5sum"
    echo "#### END ####"
end
# Block Ends Here

Upvotes: 1

Related Questions