对stdin stdout stderr感到困惑?

时间:2013-03-17 01:48:42

标签: unix stdin stderr

所以我理解命令的含义,例如1>&22>&1但是  我的问题是为什么我们使用这样的命令?将stdout重定向到stderr或从stderr重定向到stdout?

对于$[$1 $sign $2]命令(用于简单计算器),$sign是Unix中的默认命令吗?这是什么意思?括号外的$怎么样?

2 个答案:

答案 0 :(得分:2)

一个价格的两个问题。因为它们几乎完全不相关,所以最好问两个问题。

I / O重定向

  • 为什么要使用1>&2

    标准原因是shell脚本在stderr而不是stdout上报告错误。例如:

    if [ ! -f "$file" ]
    then
        echo "$0: no such file - $file" >&2
        exit 1
    fi
    
  • 为什么要使用2>&1

    您想捕获命令的所有输出。例如,您可能要运行需要很长时间的find命令,因此您可能会写:

    find $HOME -name '*perq*' -print > log.file 2>&1 &
    

    来自find的所有数据和错误消息都会发送到log.file,您可以在命令完成后稍后学习。

[(测试)命令

您询问$[$1 $sign $2]

这有很多问题,难以连贯地回答。关于计算器的问题表明,$1可能是一个数字(让我们使用13)而$2也是(让我们使用9),{{1可能是$sign+

  • -通常不被定义为变量,因此shell将尝试在PATH上找到命令$[,并且(通常)将失败。

    如果你写过$[13,那么我们会变得更好。有一个命令[ $1 $sign $2 ](也称为[)。它通常是内置的shell,但最初是一个单独的可执行文件(您通常会发现有test(或/usr/bin/test)和/bin/test(或/usr/bin/[即使在现代系统上也是可执行的。请注意,与所有命令一样,名称(/bin/[)与其参数之间用空格分隔。[命令要求最后一个参数为[。现在表达式可能是:

    ]

    然而,[ 13 + 9 ] [ 13 - 9 ] 命令会反对;它不支持算术。它支持字符串比较test=;它支持与!=-eq-ne-lt-le-gt进行数字比较。

如果您想进行算术运算,可以使用-ge命令,也可以使用其中一种内置替代方法:

expr

这会将22或4(取决于x=$(($1 $sign $2)) 的值)分配给变量$sign

答案 1 :(得分:1)

回复重定向:

在unix中,数据/文本文件在内部与称为文件处理程序(整数值)的东西相关联,这有助于操作系统在处理过程中区分和识别文件。 unix中的所有内容都被认为是一个文件,甚至是输入和输出设备。

标准输入是键盘,标准输出是标准输出,即监视器,它也作为stderr文件流,所有这些都是默认的 因此这些作为文件关联,因此分配给它们的数字.... 0,1和2.

所以当你使用类似2>& 1的东西时,你基本上是告诉操作系统将stderr(2)数据放入stdout(1)数据流

回答$符号: 这里的美元符号是一种访问变量值的方法。

示例如果您有一个变量,如下所示::

Nitin@Kaizen > a=5 
Nitin@Kaizen > echo a --> will just print a 
Nitin@Kaizen > echo $a --> will print 5  

注意:$ a与$ {a}或$ [a]相同,他们访问变量的值....解除引用

$ [$ 1 $ sign $ 2] ::你发表声明

Nitin@Kaizen > a=5
Nitin@Kaizen > b=3
Nitin@Kaizen > sign=+
Nitin@Kaizen > echo `expr $[ $a $sign $b ]`
    8   --- output is same as 5 + 3 , the value of a + b 

回答你为什么感到困惑:

你需要做一点努力才能完全读完一本书。这些是非常基础的,因此通过一些编程和学习变得清晰。

任何好的unix基础书都会涵盖文件系统(UFS)的章节,并且会有一些关于脚本的内容!

希望这会有所帮助。