再次理解shell中的重定向

shell中的重定向是平常工作中经常要用到的知识,太久没用了又忘记了,今天有时间再温习下(我看不懂我之前写的脚本了^_^)

 

参考文档:https://www.cnblogs.com/f-ck-need-u/p/8727401.html

 

我们知道,程序工作时,尤其是linux下的进程,通常会用到1个输出,和2个输出

输入:

标准输入,文件描述符为0

输出:

标准输出,文件描述符为1

标准错误输出,文件描述为2

 

默认情况下,标准输入设备是键盘,标准输出设备是屏幕,标注错误输出也是屏幕。 那么问题来了,如果我想从让一个进程从其他地方读取数据,或者输出到屏幕以外的地方怎么办呢? 我们不能去修改程序的代码滴!

但是,我们可以修改0,1,2这3个文件描述符的含义,来改变输入或输出的位置。

 

怎么修改文件描述的含义呢,使用&,下面举例说明:

1. 改变输入

cat 0<&1       我们让描述符0复制了描述符1,所以0现在指向的是stdout。 也就是说cat将从屏幕读取数据,然后又输出到了屏幕

cat <&1   这个0在这里是可以省略的

 

2. 改变输出

cat test.txt 2>&1      我们让描述符2复制了描述符1,所以2也指向了stdout, 这时输出和错误输出都会输出到屏幕了

cat test.txt >file.txt   等效于 cat test.txt 1>file.txt 

 

3. 定义一个新的描述符,描述符,尽量使用9以内的数作为文件描述符,因为大于9的可能有其他用途了

exec 3<> /tmp/a.log      这里注意<> , 它代表即可以读,有可以写,既可作为输入,也可作为输出

4. 释放描述符,定义的描述符用完之后需要释放掉

exec 3>&-

5. 描述符的移动,就是再复制旧的描述符后,释放旧的描述符

exec 4>&3-

6. 举个复杂点的例子

上面的5个例子中,你一定会发现,我有时用exec,有时没用。 在一个命中,我们重置了文件描述符,命令结束后,文件描述符会自动恢复。 如果你在shell脚本中的多个命令中,想一直维持文件描述符的重置效果,那就得用exec了。

echo 1234567890 > File # (1). 写字符串到"File".
exec 3<> File          # (2). 打开"File"并且给它分配fd 3.
read -n 4 <&3          # (3). 只读4 个字符.
echo -n . >&3          # (4). 写一个小数点.
exec 3>&-              # (5). 关闭fd 3.
cat File               # (6). 1234.67890

7. 经典的问题

ls -lh xxx  > log.txt 2>&1

ls -lh xxx 2>&1 >log.txt

上面哪个命令,能够实现将ls的标准输出和标准错误输出都输出到文件中?

解释下:

> log.txt 2>&1  它等效于     1> log.txt 2>&1    意义:描述符1指向文件log.txt,描述2也指向1所指向的log.txt

2>&1 >log.txt   它等效于     2>&1 1>log.txt     意义:描述2指向描述1指向的stdout, 描述符1指向文件log.txt

        

 

 

 

 

 

 

你可能感兴趣的:(Linux)