在`for`循环中用'tee`管道

时间:2011-07-26 14:50:43

标签: bash loops for-loop pipe tee

这可能是新手逃避的问题。我正在尝试在这样的for循环中运行命令

$ for SET in `ls ../../mybook/WS/wsc_production/`; do ~/sandbox/scripts/ftype-switch/typesort.pl /media/mybook/WS/wsc_production/$SET ./wsc_sorter/$SET | tee -a sorter.log; done;

但最终sorter.log为空。 (我确定一些输出。)如果我转义管道符号(\|),我最终根本没有sorter.log

我做错了什么?

$ bash --version
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)

编辑:糟糕,/ media / mybook /睡着了,所以实际上没有输出。首先是代码是正确的。不过,感谢大家的评论。

3 个答案:

答案 0 :(得分:4)

你正在使用tee,所以如果有输出,你会在终端上看到它。你看到了什么?

如果你看到输出,那么你可能看到的是stderr,所以你可能想要重定向它:

dir1=$HOME/sandbox/scripts/ftype-switch
dir2=/media/mybook/WS/wsc_production
for SET in ../../mybook/WS/wsc_production/*; do 
  $dir1/typesort.pl $dir2/$SET ./wsc_sorter/$SET 2>&1 | tee -a sorter.log
done

答案 1 :(得分:3)

格伦说得很好。我想提供一个不同的角度:你可以在for循环之外移动'tee'命令。这种方法的优点是tee仅被调用一次:

dir1=$HOME/sandbox/scripts/ftype-switch
dir2=/media/mybook/WS/wsc_production
for SET in ../../mybook/WS/wsc_production/*; do 
  $dir1/typesort.pl $dir2/$SET ./wsc_sorter/$SET 2>&1 
done | tee -a sorter.log

答案 2 :(得分:2)

我最深的道歉,问题出在其他地方,我的脚本实际上根本没有输出任何东西。现在它有效。

有两个原因让我觉得这个问题在逃避:

  • 当然,对bash脚本缺乏信心,这是缺乏知识和经验的影响
  • 而且,缺乏关注 - 我没想到USB上的磁盘已经睡着了,所以当我尝试循环时,实际上 没有输出

嗯,那是因为我在获取知识方面遇到了一些绊脚石...... :)