[讨论] shell script 中如何判断 stdout 是不是终端?

[讨论] shell script 中如何判断 stdout 是不是终端?

C 中有个函数 isatty() 可以判断一个 file descriptor 是不是终端类型的设备 (terminal type device), 不晓得在 shell 中如何达到同样的目的?

      
是否可以这样?
复制内容到剪贴板
代码:
$ ls -l /proc/self/fd/[12]
lrwx------ 1 huan huan 64 2007-09-01 23:24 /proc/self/fd/1 -> /dev/pts/1
lrwx------ 1 huan huan 64 2007-09-01 23:24 /proc/self/fd/2 -> /dev/pts/1
在控制台下可能是指向tty      
这样应该可以的,不过不够通用,比如俺的 mac os x 上没有 /proc 系统      
/dev/有不?
复制内容到剪贴板
代码:
$ ls -l /dev/fd/[012]
lrwx------ 1 huan huan 64 2007-09-02 17:50 /dev/fd/0 -> /dev/pts/1
lrwx------ 1 huan huan 64 2007-09-02 17:50 /dev/fd/1 -> /dev/pts/1
lrwx------ 1 huan huan 64 2007-09-02 17:50 /dev/fd/2 -> /dev/pts/1
另外在man bash中可以找到这行
引用:
-t fd  True if file descriptor fd is open and refers to a terminal.
      
/dev 还是有的:
引用:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[6300 0] ; uname -a
Darwin Tiger.local 8.10.0 Darwin Kernel Version 8.10.0: Wed May 23 16:50:59 PDT 2007; root:xnu-792.21.3~1/RELEASE_PPC Power Macintosh powerpc
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[6300 0] ; ls -l /dev/fd
total 1
crw--w----    1 clark  tty      4,   7 Sep  2 21:43 0
crw--w----    1 clark  tty      4,   7 Sep  2 21:43 1
crw--w----    1 clark  tty      4,   7 Sep  2 21:43 2
drw-r--r--   52 clark  clark      1768 Sep  2 21:40 3
dr--r--r--    2 root   wheel       512 Aug  4 20:03 4
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[6300 0] ; bye
-t fd 这个太 cooool 了,俺从来都没有注意到这个用法呢

      
原先也没用过
但在Perl中看见过类似的( -t)

      
看来俺读 bash manual 还不是很细致啊       
又学到一个技巧!!!      
在 Perl 里面,是这样处理滴

摘自《Perl 语言编程》
4.3.2 for循环
复制内容到剪贴板
代码:
$on_a_tty = -t STDIN && -t STDOUT;
   sub prompt {print "yes?" if $on_a_tty }
   for ( prompt(); <STDIN>; prompt() ) {              // 这个for循环真变态 --- by zhuomingliang
      # 处理一些事情
   }
PS:看来书中的例子大部分很经典啊,以前看的时候都没怎么注意。

      
也不是很奇怪吧

好多东西在for()里都可能做的
只是被老谭带坏了。。。