csh脚本 - 将命令块重定向到文件

时间:2017-04-19 12:38:38

标签: shell csh

我在谷歌搜索了很多,但找不到。

我有一个csh脚本来创建一个文件。有许多echo命令我想重定向到文件。

我不想在每个echo命令中重定向到该文件。有没有什么办法可以让它在单个命令中阻塞并写入文件。

这是我的剧本

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

1 个答案:

答案 0 :(得分:1)

你做不到。 foreach - 对于csh - 是内部命令,因此无法重定向。

这就是我的建议:

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

然后添加以下

logger.csh

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

如果您也想重定向错误,请在另一个.csh脚本中包含整个foreach,然后将输出重定向到/ dev / null

可替换地:

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