首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

SHELL重定向那点破事

作者:  时间: 2010-12-30

    唉,像我这个被XWindow惯坏了的,只会重定向个文件啥的。今天好容易静下心来看了看这摊子事。您要是稍微懂一点,就直接移步lightspeed的经典重定向普及贴吧。下面码的都是玩尿泥的技术。。。

    stdin0/stdout1/stderr2这三个文件描述符俺还是懂的。最简单的重定向莫过于这个经典例子了:

# ls >/dev/null 2>&1
    只要了解SHELL处理重定向时由左及右的方向就不难理解了。

     >/dev/null 等同于 1>/dev/null ,把标准输出重定向到无底洞扔掉。 2>&1是说把标准错误输出重定向到标准输出“指向的地方“。无论标准输出指向了哪里。所以该命令可以理解为:“标准输出内容扔到无底洞里。标准错误输出看考标准输出把内容扔到无底洞里了,自己也把内容扔到无底洞里“。

    与之对应的例子是:

# ls 2>&1 1>/dev/null
    按顺序走:标准错误输出扔到标准输出的靶子上,就是屏幕。标准输出自己改以下靶子,扔到无底洞里。

    我理解这些东西花了好长时间,关键就是没理解重定向符号 ">&"是个什么东西。其实可以认为是复制。我给自己想的例子就是“按照1的方向另扯一根水管,然后把原来那根水管拿走“。然后我就明白了下面这句代码的意思了:

# exec 3>&2
# ls FileNotExist
2>errlog
# exec
2>&3
# exec
3>&-
    无非就是“扯一根管子3备份。管子2挪作他用。管子2拿回原地。管子3撤掉“。他爷爷的,真绕。

    之前想了好久,能不能通过复制重定向实现同时双输出?即一个输出到文件,另一个输出到屏幕?反正我没想出来。后来还是用tee实现的。

tee - read from standard input and write to standard output and files
   
# echo gaga | tee log
gaga
# cat log
gaga

 

    对我来说,这就够用了。高级技能?用的时候再说吧。