`
zang232
  • 浏览: 10166 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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  为真则为真。

 

 

 

  • 大小: 9.7 KB
  • 大小: 14.5 KB
  • 大小: 13.6 KB
  • 大小: 4.8 KB
  • 大小: 4.4 KB
分享到:
评论

相关推荐

    std::string format格式化函数源代码及两种格式化方法

    自定义`format`函数的优点是可以根据项目的特定需求进行定制,比如添加更多的格式化选项,或者提供更友好的API。这种方法在某些情况下比直接使用`std::stringstream`更加灵活和高效。 在项目压缩包中,`string_...

    PHP格式化输出函数

    ### PHP格式化输出函数:深入理解与应用 在PHP编程中,格式化输出函数是开发者进行调试、数据展示以及信息处理的...通过灵活配置函数参数,开发者可以根据具体需求定制最合适的输出形式,使代码更加健壮、易于维护。

    SAS (统计分析软件)课件:第12章 输出控制.ppt

    通过ODS语句,用户可以指定哪些输出对象应被生成,从而实现高度的灵活性和定制化。 举例来说,以下是一个使用ODS的例子: ```sas ods listing close; ods output parameterestimates=MyOutput; proc reg data=...

    android XMl 解析神奇xstream 三: 把复杂对象转换成对象

    在Android开发中,XML是一种广泛使用的数据交换格式,特别是在序列化和反序列化对象时。XStream是一个强大的库,它允许我们轻松地将Java对象转换为XML,反之亦然。本篇文章将深入探讨如何利用XStream在Android环境中...

    使用自定义格式化程序将ElmDebuglog输出转换为nice日志对象

    总之,自定义日志格式化程序是提升Elm应用调试体验的有效工具,它允许开发者根据自己的需求定制日志输出的样式和内容。通过理解Elm与JavaScript之间的交互机制,以及如何在JavaScript中处理接收到的Elm数据,我们...

    oracle数据库对象导出脚本

    本文档提供了一个完整的Oracle数据库对象导出脚本示例,涵盖了设置环境参数、定制输出格式以及获取不同类型数据库对象的定义等关键步骤。通过这些步骤,用户可以方便地导出所需的数据库对象定义,便于后续的备份、...

    使用简单工厂模式作多种输出的万年历

    在编程中,实现一个万年历通常需要处理日期计算、星期分配以及格式化输出等任务。在这个项目中,你可以指定行列数来定制日历的展示样式。 简单工厂模式的核心在于一个工厂类,这个工厂负责根据输入参数(可能是用户...

    Java字符串 日期 数字格式化输出-.doc

    DecimalFormat 类可以通过提供一个格式化的模式来实现定制格式化输出。 DecimalFormat DecimalFormat 类可以通过提供一个格式化的模式来实现定制格式化输出。模式是一个字符串,包含一些特殊的字符,每个字符都有...

    测量程序编制 - python 56格式化输出:时间日期—time模块.pptx

    在Python编程中,处理日期和时间是常见的任务,Python提供了time和calendar两个模块来帮助我们进行日期和...通过这些模块和方法,我们可以轻松地在各种日期和时间格式之间进行转换,并且能够根据需要定制输出的格式。

    11 自己的JS调试工具 myLogger()对象

    首先,myLogger()对象是一个自定义的日志记录工具,它的主要目的是替代或扩展浏览器内置的console.log()函数,提供更加灵活和定制化的日志输出功能。通过创建这样一个对象,开发者可以自定义日志级别、颜色、格式,...

    ArcEngine地图图片输出

    3. `ExportMapToImage`函数实现了导出逻辑,它根据用户选择的文件类型创建相应的导出器对象,并设置必要的输出参数,如分辨率和坐标范围,最后执行导出并返回结果。 通过以上分析,我们可以看到,在ArcEngine中实现...

    Python变量的输入输出-格式化输出整数变量

    Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和...

    winform DateTime格式化输出

    `ToString()`方法允许我们根据特定的模式或格式字符串来定制输出。例如,如果我们想要显示“年-月-日”的格式,可以这样写: ```csharp DateTime.Now.ToString("yyyy-MM-dd") ``` 这里的"yyyy-MM-dd"就是一种标准...

    CString.Format格式化输出和ToString()的一些常用用法.pdf

    它可以通过指定的格式字符串来定制输出格式。 3. 格式化类型包括: - "n":表示数字格式,可以按当前文化或区域设置显示货币值。 - "C":表示货币值,同样会根据系统区域设置显示货币符号和小数点后的位数。 - ...

    android XMl 解析神奇xstream 二: 把对象转换成xml

    在Android开发中,XML是一种广泛使用的数据存储和交换格式,特别是在序列化对象为持久化格式时。XStream是一个强大的库,它使得Java对象与XML之间的转换变得极其简单。本篇文章将深入探讨如何在Android环境中利用...

    Getting Started with the OutputDelivery System

    - **识别输出对象**:用户需识别并选择哪些输出对象将被发送至ODS目的地。 - **创建输出数据集**:对于需要进一步分析的数据,创建输出数据集是必不可少的步骤。 - **在结果文件夹中存储链接**:为了方便管理和访问...

    C# Tostring 格式化输出字符串全解

    综上所述,C#中的ToString方法结合格式化代码,为数据的文本表示提供了强大的定制能力,无论是基本数值还是复杂的日期时间数据,都能得到精确且美观的文本输出。这对于提高应用程序的用户体验和数据处理的准确性至关...

    CAD快捷键命令大全.pdf

    CAD,即计算机辅助设计(Computer-Aided Design),是一种广泛用于工程和设计领域的软件工具,用于绘制、修改和分析二维和三维...在实际工作中,可以根据个人习惯和需求定制自己的快捷键设置,以达到最佳的工作效果。

    C#创建与Excel打印输出

    综上所述,C#与Excel的集成允许开发人员构建灵活的报告和数据分析工具,利用Excel的强大功能,同时简化了打印定制,满足不同用户需求。通过熟练掌握这些技术,可以大大提高工作效率并提升用户体验。

    日期时间格式化集锦.doc

    理解这些格式化字符串对于开发人员来说至关重要,因为它们允许灵活地定制日期和时间的显示方式,满足不同场景的需求。例如,可以用于创建用户友好的日期输入字段、格式化数据库存储的日期数据、在日志中记录事件时间...

Global site tag (gtag.js) - Google Analytics