shell脚本 - 尝试不使用tmp文件

时间:2013-08-04 08:14:08

标签: bash shell

如果没有tmp1和tmp2,我怎么能这样做? (信息文件很好)

      cat information_file1 | sed -e 's/\,/\ /g' >> tmp1
      echo Messi >> tmp2
      cat tmp1 | grep Ronaldo  | cut -d"=" -f2- >> tmp2
      rm tmp1
      cat information_file2 | fin_func tmp2
      rm tmp2

fin_func为你的见解。(它不是真正的功能,我不想改变它只是你会看到我如何使用tmp2和info_file2)

while read -a line; do

if [[ "`grep $line $1`" != "" ]]; then
echo 1
fi

done

2 个答案:

答案 0 :(得分:1)

这应该有用,虽然它非常不全面:

cat information_file2 | fin_func <(cat <(echo Messi) <(cat information_file1 | \
  sed -e 's/\,/\ /g' | grep Ronaldo | cut -d"=" -f2-))

<( … )语法为Bash’s process substitution,它返回文件/dev/fd文件描述符的名称及其写入的输出。

答案 1 :(得分:0)

示例fin_func多次读取作为命令参数给出的文件,因此除非允许我们修改该函数,否则至少需要一个临时文件。问题中给出的样本fin_func可以很容易地修改,以便它不会多次读取文件,但由于您指出这不是真正的脚本,我将假设它不能被修改,并且必须将文件作为一个论点。那就是说,我会把你的剧本写成:

trap 'rm -f $TMPFILE' 0  # in bash, just trapping on 0 will work for SIGINT, etc 
TMPFILE=$( mktemp ) 

{ echo Messi
tr , ' '  < information_file1 | 
awk -F= '/Ronaldo/{print $2}' ; } > $TMPFILE
< information_file2 fin_func $TMPFILE

我强烈怀疑fin_func可以被重写,因此它不需要常规文件作为输入。此外,不需要tr,因为gsub只能在awk匹配行并保存一些处理,但这可能是一个微不足道的优化。但是,使用tr代替sed在美学上是必要的。