2

我认为生成临时文件可能会更慢,如果用户按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

是否可以删除临时文件 list.1?

4

4 回答 4

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

您可以通过将循环放置在函数中来使其看起来更容易识别(您可以在脚本文件中或直接在 shell 中执行此操作):

step_1() {
  for f in bin/* ; do
    ldd $f 2>/dev/null | awk '{print $1}'
  done
}

step_2() {
  while read soname ; do
    process_so_name $soname
  done
}

step_1 | grep -v -e '^not$' -e 'ld-linux' | step_2

要连接 SIGINT,请执行以下操作:

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

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

trap "echo SIGTERM; rm -f tempfile; exit -1" EXIT
于 2013-01-26T04:16:22.253 回答
2

除了@MihaiDanila 的正确答案,

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

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会做一个分叉,所以主循环的环境将在最后被丢弃。

看:man -Len -Pless\ -i\ +/^\\\ *process\\\ substitution$ bash

于 2013-01-26T08:31:38.457 回答
1

喜欢@M

另一种没有临时文件的方法

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)
于 2013-01-26T04:21:55.613 回答
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
于 2013-01-26T04:27:50.123 回答