我认为生成临时文件可能会更慢,如果用户按 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
是否可以删除临时文件列表。?
答案 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)
没有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