如何在bash脚本中重写while循环以防止创建临时文件?

时间:2013-01-26 04:13:04

标签: bash

我认为生成临时文件可能会更慢,如果用户按 ctrl + c ,临时文件将变为垃圾。

这是我的原始代码

for f in bin/* ; do
  ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux' > list.1
while read soname ; do
  process_so_name $soname
done < list.1

是否可以删除临时文件列表。?

4 个答案:

答案 0 :(得分:5)

只需在没有临时文件的情况下执行此操作。将最后一个grep的结果输入到while。

你可以挂钩到SIGINT来检测Ctrl + C,但是如果你不需要,为什么要担心?你仍然无法加入SIGKILL。

for f in bin/* ; do
  ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux' | while read soname ; do
  process_so_name $soname
done

要挂钩到SIGINT,请执行以下操作:

trap "echo SIGINT; rm -f tempfile; exit -1" INT

要挂钩到SIGTERM(请参阅下面的评论),请执行以下操作:

trap "echo SIGINT; rm -f tempfile; exit -1" EXIT

答案 1 :(得分:1)

像@M

一样

没有tempfile的另一种方式

function func_name(){
for f in bin/* ; do
ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux'
}

while read soname ; do
process_so_name $soname
done < <(func_name)

测试

function func_name2(){
echo 1
echo 2
}

while read soname ; do
echo $soname
done < <(func_name2)

答案 2 :(得分:1)

除了@MihaiDanila的正确答案,

如果您不想在循环中重用某些统计值,则必须重新排序脚本并使用流程替换

total=0
processed=0
while read soname ; do
  ((total=total+1))
  process_so_name $soname && ((processed=processed+1))
done < <(
    for f in bin/* ; do
      ldd $f 2>/dev/null | awk '{print $1}'
    done |
      sort -u |
      grep -v -e '^not$' -e 'ld-linux'
)
printf "Total file %d, processed ok: %d, last filename: '%s'" \
    $total $processed $soname

使用管道的语法(如... grep -v | while read soname将在管道后执行 fork ,因此主循环的环境将在最后被删除。

请参阅:man -Len -Pless\ -i\ +/^\\\ *process\\\ substitution$ bash

答案 3 :(得分:0)

以下是否适用于您?

for f in bin/* ; do
  ldd $f 2>/dev/null | awk '{print $1}'
done | sort -u | grep -v -e '^not$' -e 'ld-linux' | xargs -n 1 process_so_name