所以我理解命令的含义,例如1>&2
或2>&1
但是
我的问题是为什么我们使用这样的命令?将stdout重定向到stderr或从stderr重定向到stdout?
对于$[$1 $sign $2]
命令(用于简单计算器),$sign
是Unix中的默认命令吗?这是什么意思?括号外的$怎么样?
答案 0 :(得分:2)
一个价格的两个问题。因为它们几乎完全不相关,所以最好问两个问题。
为什么要使用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)的章节,并且会有一些关于脚本的内容!
希望这会有所帮助。