|

楼主 |
发表于 2005-8-15 06:57:38
|
显示全部楼层
这个命令有一定的代表性。分析一下:
1. 其实这个命令要拆成两个命令看。一是time这个命令(这个time命令指的是bash的builtin命令),他有自己的stderr。还有就是date这个命令,它有自己的stdout.
2. time这个命令特殊的地方就是对命令的重定向无法在当前shell环境完成。可以试试- time 1>/dev/null OR time 2>/dev/null OR time &>/dev/null
复制代码 ,无论怎么样,stderr都会显示。现在知道的唯一的方法是采用subshell的方式,让time在subshell生成stderr,然后在主shell来重定向操作。date命令输出方式是简单的。
3. 这个命令的执行顺序应该是:1. time执行并等待下一个命令结束。2. date执行并结束。3. time计算命令运行时间并结束.
3. 知道了原因,就可以对time date这个命令的重定向进行操作了。对date的输出进行操作可以在命令运行同时来完成, 或放到subshell来完成,或放到上层的主shell。而对time的stderr转stdout的操作就必须放在主shell来完成。这样的话我们可以重定向这样几种情况:
1. 只需要time的输出。- time date 1>/dev/null OR (time date) 1>/dev/null OR (time date 1>/dev/null) OR eval time date 1>/dev/null
复制代码
虽然结果一样,但是重定向的层和次序不一样。第一和第三中方式的重定向只单单的对date命令,根本不涉及对time的输出,同时重定向的层是一样的,但第二种重定向发生在命令运行的上层主shell,且是对time和date命令的共同输出做处理。第四种是利用了eval来将time和date作为整个命令一起执行,意义和第二种一样。
2. 只需要date的输出。- (time date) 2>/dev/null OR eval time date 2>/dev/null
复制代码
重定向都是在time和date的输出完成后执行的。
3。屏蔽所有输出。- (time date) &>/dev/null OR (time date &>/dev/null) 2>/dev/null
复制代码
第一种是在所有输出结束后整体屏蔽掉,后一种是先屏蔽date的输出,然后在屏蔽time的输出。
类似的,我们可以实现对不同的输出转入文件。 |
|