shell 重定向的一处妙用

标签: Programming | 发表时间:2011-10-18 11:41 | 作者:王 聪 Kindy
出处:http://wangcong.org/blog

偶然在 dracut 的代码中发现一个使用重定向很巧妙的地方。见 modules.d/90kernel-modules/module-setup.sh 文件。

之前的老代码是这样的:

BASH:
  1. ##
  2.              local _f
  3.              while read _f; do case "$_f" in
  4.                  *.ko)    [[ $(<        $_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  5.                  *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  6.                  esac
  7.              done

意思很清楚吧?就是在内核模块(注意是二进制格式)中匹配一些函数(字符串)。这样会很慢,因为 bash 要在庞大的二进制文件流中匹配一些指定字符串。

于是,就有人想了一个方法加速这个处理过程,把原来的单个数据流分成两个并行的数据流,同时进行匹配!很巧妙!

BASH:
  1. ##
  2.              function bmf1() {
  3.                  local _f
  4.                  while read _f; do case "$_f" in
  5.                      *.ko)    [[ $(<        $_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  6.                      *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  7.                      esac
  8.                  done
  9.              }
  10.              # Use two parallel streams to filter alternating modules.
  11.              local merge side2
  12.              ( ( local _f1 _f2
  13.                  while  read _f1; do   echo "$_f1"
  14.                      if read _f2; then echo "$_f2" 1>&${side2}; fi
  15.                  done \
  16.                  | bmf1     1>&${merge}    ) {side2}>&1 \
  17.                  | bmf1  )      {merge}>&1

经过 refactor 之后的或许更好理解一些:

BASH:
  1. # subfunctions inherit following FDs
  2.             local _merge=8 _side2=9
  3.             function bmf1() {
  4.                 local _f
  5.                 while read _f; do case "$_f" in
  6.                     *.ko)    [[ $(<        $_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  7.                     *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;;
  8.                     esac
  9.                 done
  10.             }
  11.             function rotor() {
  12.                 local _f1 _f2
  13.                 while read _f1; do
  14.                     echo "$_f1"
  15.                     if read _f2; then
  16.                         echo "$_f2" 1>&${_side2}
  17.                     fi
  18.                 done | bmf1 1>&${_merge}
  19.             }
  20.             # Use two parallel streams to filter alternating modules.
  21.             eval "( ( rotor ) ${_side2}>&1 | bmf1 ) ${_merge}>&1"

相关 [shell 重定向] 推荐:

shell 重定向的一处妙用

- Kindy - A Geek&#39;s Page
偶然在 dracut 的代码中发现一个使用重定向很巧妙的地方. 见 modules.d/90kernel-modules/module-setup.sh 文件.                  *.ko)    [[ $(<        $_f) =~ $_blockfuncs ]] && echo "$_f" ;;.

Shell编程

- - 博客园_首页
本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的. 回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了. 今天就把自己学习的相关知识点总结整理一下. 个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

GNOME Shell 3.2 预览

- timebug - LinuxTOY
近日 Allan 在他的博客上分享了最近在 GNOME Shell 3.2 上的开发进度. 整合聊天和消息程序(由 Guillaume Desmottes 开发). 登陆系统时自动登陆聊天服务,不再需要额外启动聊天程序. 直接在 Shell 即可语音通话,回复聊天邀请,文件传输. 通知计数器(由 Guillaume Desmottes 开发).

Ubuntu11.10 GNOME Shell指南

- 个人 - 译言-每日精品译文推荐
Ubuntu 11.10终于提供了一种安全方便的方式去安装和使用“GNOME Shell”——GNOME的新桌面交互接口. 这意味着不像之前的版本那样,现在它不需要任何额外的插件,或者执行任何可疑的脚本它可以从Ubuntu软件中心直接安装,只需一次简单的点击. 为了在ubuntu上获得更好的体验我们需要安装一些额外的插件.

Shell 小技巧一则

- Hinc - LinuxTOY
经常与 Shell 为伍的你是不是也会经常碰到下面这些情境:. 要保存某些文件到特定目录,然后开始查看/编辑 1$ cp /somewhere/foo.c /somewhere/foo.c.orig 2$ vi /somewhere/foo.c. 或者先备份某个文件,然后开始捣鼓 1$ tar zcvf archives.tgz /somewhere/folder /and/somewhere/file1 /and/somewhere/file2 2$ scp archives.tgz [email protected]:~/blabla/.

ibus的GNOME Shell扩展

- 小汐 - 画猫不成反类虎
更新代码,支持横排模式(设置后需要重启gnome shell). 这个扩展使用了ibus的一些新API,该API还没有发布,需要自行编译ibus的git仓库代码. 以前说过GNOME3的一个缺点,在通知栏聊天时,无法看到ibus的候选词界面,确切地说是候选词界面被通知栏聊天界面挡住了. 这是GNOME Shell的架构所决定的,目前没有方法可以绕过(除非修改GNOME Shell)本身.

移植Google Calendar到 GNOME Shell

- 欧剃 - 笨兔兔
GNOME Shell Google Calendar 将Google 日历移植到了GNOME Shell上. python脚本可保存密码,自动获取新的谷歌日历事件. 但目前没有图形化的配置界面,导入日历. GNOME 3.2(+3.1.90.x) 目前通过“Online accounts”已经移植了谷歌日历,但是只能在上述版本中实现.

Ubuntu 11.10 GNOME Shell 指南

- 雪冬 - 笨兔兔
注,本文由笔者翻译自 http://www.omgubuntu.co.uk/2011/10/gnome-shell-ubuntu-11-10-guide/. Ubuntu 11.10最终提供给喜欢猎奇的用户一个简单安全的方式来安装和尝试“GNOME Shell”——新的GNOME桌面接口. 这意味着不像之前的Ubuntu发行版,在Ubuntu中安装GNOME Shell不需要添加额外的软件源(PPA)或运行各种脚本:如今它可以在Ubuntu软件中心直接安装——只需要简单地点击一下鼠标即可完成.

Linux shell用法和技巧

- - 外刊IT评论
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧. 当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务. 于是,我开始在一个文本文件里记录这些用法,并放在我的Dropbox里,现在,向大家分享这个文件. 需要注意一点的是,有些用法需要在你的Linux系统里安装额外的软件.