02:根据输出对象的不同,定制不同的输出格式

linux中的一些命令,很有意思。它们可以根据输出对象的不同,产生不同的输出格式。

以curl命令为例,假如我们想获取baidu的响应头:

先看下直接在屏幕输出的情况:


然后我们再把这个结果重定向到文件中看一下:

 


我们把上面的命令写入了header-baidu文件,但出人意料的是,它出现了红框标识出的概要部分;你也许会说,这有什么奇怪,输出分stdout,stderr啊,> 符号只接收了来自1的输出,2的输出自然就写到屏幕了。那么我们来验证一下:


的确,1和2都写入了文件之中,但问题就来了:为什么直接输出到屏幕和输出到文件的结果不同呢?

 

看到了吧,似乎命令本身能够识别它的输出对象是标准输出(屏幕),还是文件,然后做不同的反应。

MC,mysql的一些命令也具有这种特性,那么这个是如何实现的呢?

 

首先:通过这个例子,我们要注意,linux的一些命令可能直接屏幕输出跟输出到文件的结果不一致,因此如果你需要做某些进一步的依赖此结果的操作时,需要注意这种差异;

 

然后:我们可以通过如下的示例来看看,如果你自己想实现类似功能,可以怎么做?

#!/bin/bash

if [[ -t 1 ]]  ##magic happen.
then
        echo "#########stdout"
        echo -e "name\ttype\tlength";
else
        echo "#########file"
fi

echo -e "july\tstring\t20"
 

我们来测试一下:


看到了吧,脚本能够判断输出是什么对象了,呵呵。

所有的奇迹发生在,shell的这个判定上:

-t  FD  ] 如果文件描述符 FD  打开且指向一个终端则为真。

 

那我们可以试一下:将上面的代码改成判断输入类型的情况,看看起不起作用:

#!/bin/bash

if [[ -t 0 ]] #0是stdin
then
        echo "#########stdout"
        echo -e "name\ttype\tlength";
else
        echo "#########file"
fi

echo -e "july\tstring\t20"

 我们来测试一下:


 

呵呵,看到了吧,同样可以识别输入的类型了:)

 

 

附:shell可用的判定规则:

表 7.1. 主表达式
Primary 意义
-a  FILE  ] 如果 FILE  存在则为真。
-b  FILE  ] 如果 FILE  存在且是一个块特殊文件则为真。
-c  FILE  ] 如果 FILE  存在且是一个字特殊文件则为真。
-d  FILE  ] 如果 FILE  存在且是一个目录则为真。
-e  FILE  ] 如果 FILE  存在则为真。
-f  FILE  ] 如果 FILE  存在且是一个普通文件则为真。
-g  FILE  ] 如果 FILE  存在且已经设置了SGID则为真。
-h  FILE  ] 如果 FILE  存在且是一个符号连接则为真。
-k  FILE  ] 如果 FILE  存在且已经设置了粘制位则为真。
-p  FILE  ] 如果 FILE  存在且是一个名字管道(F如果O)则为真。
-r  FILE  ] 如果 FILE  存在且是可读的则为真。
-s  FILE  ] 如果 FILE  存在且大小不为0则为真。
-t  FD  ] 如果文件描述符 FD  打开且指向一个终端则为真。
-u  FILE  ] 如果 FILE  存在且设置了SUID (set user ID)则为真。
-w  FILE  ] 如果 FILE  如果 FILE 存在且是可写的则为真。
-x  FILE  ] 如果 FILE  存在且是可执行的则为真。
-O  FILE  ] 如果 FILE  存在且属有效用户ID则为真。
-G  FILE  ] 如果 FILE  存在且属有效用户组则为真。
-L  FILE  ] 如果 FILE  存在且是一个符号连接则为真。
-N  FILE  ] 如果 FILE  存在 and has been mod如果ied since it was last read则为真。
-S  FILE  ] 如果 FILE  存在且是一个套接字则为真。
FILE1  -nt  FILE2  ] 如果 FILE1  has been changed more recently thanFILE2  , or 如果 FILE1  FILE2  does not则为真。 exists and
FILE1  -ot  FILE2  ] 如果 FILE1  比 FILE2  要老, 或者 FILE2  存在且FILE1  不存在则为真。
FILE1  -ef  FILE2  ] 如果 FILE1  和 FILE2  指向相同的设备和节点号则为真。
-o  OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z  STRING ] “STRING” 的长度为零则为真。
[ -n  STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq  , -ne  , -lt  , -le  , -gt  or -ge . These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.
表 7.2. 组合表达式
操作 效果
[ ! EXPR ] 如果 EXPR  是false则为真。
[ ( EXPR ) ] 返回 EXPR  的值。这 样可以用来忽略正常的操作符优先级。
[ EXPR1 -a EXPR2 ] 如果 EXPR1  and EXPR2  全真则为真。
[ EXPR1 -o EXPR2 ] 如果 EXPR1  或者 EXPR2  为真则为真。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值