漫谈由标准输入\输出\错误输出引发的思考
标准输入|输出|错误输出
在Unix\Linux
体系中,一个进程通常自带有标准输入、标准输出、标准错误输出等三个文件描述符。
如果从对称的观点来看,它确实长的有点奇怪,但它背后隐藏了什么样的知识和道理呢?
从图灵机模型谈起
以前谈到现在计算机背后的理论结构是图灵机,而图灵机模型仅需要左右两边的纸带,其实可以直接对应输入和输出。
那么多出来的标准错误输出是做什么的呢?
从程序的运行期输出结构谈起
我们知道,一个程序在运行期不携带日志系统通常是无法想象的,但是,一般程序又有自己的输出数据,而日志信息是明显有区别于这些输出协议数据。
这个在Unix\Linux
体系中典型程序ssh
中,明显区分了标准错误输出和标准输出的不同,以利于运行期信息和数据的分别输出,见ssh的scp模式
。
# 甚至可以日通过管道组合命令,避免scp过程中间文件的形成
ssh user@remotehost 'cat > remotefile' < localfile
ssh user@remotehost 'cat remotefile' > localfile
另外,特别在Shell
编程中,经常通过管道或者IO重定向组合拼接命令。如果命令运行过程中,出现某些提示或错误信息,可以能够标准错误输出对应的控制台或终端,及时展现将是非常方便的。
它山之石
通过阅读一些网络E文,感觉Unix\Linux
体系特别地具有标准输出错误文件描述符,可能来自传统实践,和shell
编程上的便利。
我们通常也可以看到,如果程序的标准输出也是日志信息的情况下,在日志收集的时间,采用1>log.txt 2>&1 or &>log.txt
的命令语法,将标准输出和错误输出都指向相同的目的。
谈谈普适图灵机
在一系列图灵机中,有一类的图灵机具有普适的特点,我们称其为普适图灵机。
这类图灵机的核心就是可以将其它图灵机的控制转移函数
作为自己的输入,然后再去模拟那个图灵机的行为。
如果从学习的观点来看,这其实就相当于学习过程,增强了个人能力,所以,才能普适。
如果从递归的观点来看,这其实就相当于无穷套娃的能力。需要指出的是,在可计算性理论模型上,图灵机理论与递归理论被认为是等价的计算模型。
不严格地说明,普适图灵机正是展现了递归特点,图灵机的图灵机。
特别思考
可计算模型界定的问题是什么是可计算,和什么是不可计算。
可计算模型中计算的涵义,与我们通常认为的计算有细微的区分,但都包括我们普通意义上的计算。
可认为可计算模型中的计算,是计算的尽头;它之外是不可计算!
某些特殊命令
某些特殊命令,不单单从命令参数接受参数,也可以从标准输入接受参数,但,例如,cat
和md5sum
只能从标准输入传入字符串参数,则需要here document
和here string
技术。
cat << _EOF_
<html>
...
</html>
_EOF_
cat <<< 'Hello world'
md5sum <<< 'aaa'
对比来看,tar
命令明显地区分了标准输入参数和标准输出参数时的涵义。特别地,tar
命令通过’-'符号来约定指明。
- 可以看到’-'符号并不专门指代标准输入或标准输出,而是命令的一种处理约定
If you use ‘-’ as an archive-name, tar reads the archive from standard input (when listing or extracting files),
or writes it to standard output (when creating an archive).
If you use ‘-’ as an archive-name when modifying an archive, tar reads the original archive from its standard input and writes the entire new archive to its standard output.
参考
- Tar对于’-'符号作为标准输入和输出的约定处理