0

所以我理解命令的含义,例如1>&2or2>&1但我的问题是我们为什么要使用这样的命令?将标准输出重定向到标准错误或从标准错误重定向到标准输出?

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

4

2 回答 2

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),并且$sign可能是+or -

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

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

    [ 13 + 9 ]
    [ 13 - 9 ]
    

    但是,该test命令会反对;它不支持算术。它确实支持字符串比较=!=-eq它支持与、-ne-lt-le-gt进行数字比较-ge

如果要进行算术运算,可以使用expr命令或内置替代方法之一:

x=$(($1 $sign $2))

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

于 2013-03-17T03:34:27.733 回答
1

重定向答案:

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

标准输入是键盘,标准输出是标准输出,即监视器,它也用作标准错误文件流,所有这些都是默认情况下,因此这些都作为文件关联,因此分配给它们的数字 ....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 

回答你为什么感到困惑:

您需要稍加努力才能完全重新阅读一本书。这些是非常基础的,因此通过一些编程和学习变得清晰。

任何涵盖文件系统(UFS)章节和一些脚本编写的优秀unix基础书籍都可以!

希望这可以帮助。

于 2013-03-17T02:59:27.127 回答