LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: yongjian

time date 的output [己解决]

[复制链接]
发表于 2005-8-14 15:52:59 | 显示全部楼层
(time date) 2>foo>&2
运行这个命令, 就可以将stdout屏蔽。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 03:03:01 | 显示全部楼层
Post by jzz04
(time date) 2>foo>&2
运行这个命令, 就可以将stdout屏蔽。

其实屏蔽stdout很简单。
  1. (time date) &>/dev/null
复制代码
就行了。只要理解了这个命令是怎样输出的,操作起来方法还是很多的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 06:57:38 | 显示全部楼层
这个命令有一定的代表性。分析一下:
1. 其实这个命令要拆成两个命令看。一是time这个命令(这个time命令指的是bash的builtin命令),他有自己的stderr。还有就是date这个命令,它有自己的stdout.
2. time这个命令特殊的地方就是对命令的重定向无法在当前shell环境完成。可以试试
  1. 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的输出。
  1. 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的输出。
  1. (time date) 2>/dev/null OR eval time date 2>/dev/null
复制代码

       重定向都是在time和date的输出完成后执行的。
    3。屏蔽所有输出。
  1. (time date) &>/dev/null OR (time date &>/dev/null) 2>/dev/null
复制代码

       第一种是在所有输出结束后整体屏蔽掉,后一种是先屏蔽date的输出,然后在屏蔽time的输出。
类似的,我们可以实现对不同的输出转入文件。
回复 支持 反对

使用道具 举报

发表于 2005-8-16 12:15:48 | 显示全部楼层
其实是很简单的道理,time程序是直接写/dev/tty而不是读写FILENO_OUT FILENO_ERR的
回复 支持 反对

使用道具 举报

发表于 2005-8-16 12:19:39 | 显示全部楼层
$cat 1.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
  int fd;
  fd = open("/dev/tty",O_WRONLY);
  write(fd,"never blocked\n",14);
}

$gcc 1.c -o 1

$./1 &>/dev/null
never blocked
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-16 14:18:57 | 显示全部楼层
Post by hellwolf
$cat 1.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
  int fd;
  fd = open("/dev/tty",O_WRONLY);
  write(fd,"never blocked\n",14);
}

$gcc 1.c -o 1

$./1 &>/dev/null
never blocked


不错,谢谢!这就彻底搞明白了。 我没有看源码,只是从重定向的角度考虑问题了。那么有没有办法来disable从tty的输出呢?
回复 支持 反对

使用道具 举报

发表于 2005-8-16 18:59:43 | 显示全部楼层
呵呵,我想我们都搞错了。。。。。。。。。

$type time
time is a shell keyword

$/usr/bin/time date &>/dev/null
$


哈哈,看来,有时候不能轻易下结论阿
回复 支持 反对

使用道具 举报

发表于 2005-8-16 19:43:00 | 显示全部楼层
  1. # echo 'time date' | strace bash 2>&1 | grep -A1 'tty'
  2. open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
  3. close(3)                                = 0
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-16 22:33:30 | 显示全部楼层
Post by hellwolf
呵呵,我想我们都搞错了。。。。。。。。。

$type time
time is a shell keyword

$/usr/bin/time date &>/dev/null
$


哈哈,看来,有时候不能轻易下结论阿

没有吧,我前面的帖子说的很清楚,就是用的builtin的time命令。如果是/usr/bin/time,就不存在这个问题了。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 08:31:21 | 显示全部楼层
但道理却不是我说的那个道理(输出到/dev/tty)

直是因为重定向符号是针对后面的命令而已,不会针对time

格式是:
time [command]

很容易证明:
$time | less
-bash: syntax error near unexpected token `|'

怎么样,time不是个普通的东西,bash对自己的内建函数是不做重定向的。

我上面的推断完全是从现象推原因的,所以出错了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表