您的位置:首页 > 运维架构 > Linux

linux 重定向命令/ exec用法总结

2012-11-26 10:16 381 查看
1、linux 重定向命令

标准输入,输出和错误

---------------------------------

文件文件 描述符

---------------------------------

输入文件—标准输入 0

输出文件—标准输出 1

错误输出文件—标准错误 2

---------------------------------

COMMAND_OUTPUT >
2       # 将stdout重定向到一个文件.
3       # 如果这个文件不存在, 那就创建, 否则就覆盖.
4
5       ls -lR > dir-tree.list
6       # 创建一个包含目录树列表的文件.
7
8    : > filename
9       # >操作, 将会把文件"filename"变为一个空文件(就是size为0).
10       # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
11       # :是一个占位符, 不产生任何输出.
12
13    > filename
14       # >操作, 将会把文件"filename"变为一个空文件(就是size为0).
15       # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
16       # (与上边的": >"效果相同, 但是某些shell可能不支持这种形式.)
17
18    COMMAND_OUTPUT >>
19       # 将stdout重定向到一个文件.
20       # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
21
22
23       # 单行重定向命令(只会影响它们所在的行):
24       # --------------------------------------------------------------------
25
26    1>filename
27       # 重定向stdout到文件"filename".
28    1>>filename
29       # 重定向并追加stdout到文件"filename".
30    2>filename
31       # 重定向stderr到文件"filename".
32    2>>filename
33       # 重定向并追加stderr到文件"filename".
34    &>filename
35       # 将stdout和stderr都重定向到文件"filename".
36
37    M>N
38      # "M"是一个文件描述符, 如果没有明确指定的话默认为1.
39      # "N"是一个文件名.
40      # 文件描述符"M"被重定向到文件"N".
41    M>&N
42      # "M"是一个文件描述符, 如果没有明确指定的话默认为1.
43      # "N"是另一个文件描述符.
44
45       #==============================================================================
46
47       # 重定向stdout, 一次一行.
48       LOGFILE=script.log
49
50       echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
51       echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
52       echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
53       echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
54       # 每行过后, 这些重定向命令会自动"reset".
55
56
57
58       # 重定向stderr, 一次一行.
59       ERRORFILE=script.errors
60
61       bad_command1 2>$ERRORFILE       #  Error message sent to $ERRORFILE.
62       bad_command2 2>>$ERRORFILE      #  Error message appended to $ERRORFILE.
63       bad_command3                    #  Error message echoed to stderr,
64                                       #+ and does not appear in $ERRORFILE.
65       # 每行过后, 这些重定向命令也会自动"reset".
66       #==============================================================================
67
68
69
70    2>&1
71       # 重定向stderr到stdout.
72       # 将错误消息的输出, 发送到与标准输出所指向的地方.
73
74    i>&j
75       # 重定向文件描述符i到j.
76       # 指向i文件的所有输出都发送到j.
77
78    >&j
79       # 默认的, 重定向文件描述符1(stdout)到j.
80       # 所有传递到stdout的输出都送到j中去.
81
82    0< FILENAME
83     < FILENAME
84       # 从文件中接受输入.
85       # 与">"是成对命令, 并且通常都是结合使用.
86       #
87       # grep search-word <filename
88
89
90    [j]<>filename
91       # 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它.
92       # 如果文件"filename"不存在, 那么就创建它.
93       # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
94       #
95       # 这种应用通常是为了写到一个文件中指定的地方.
96       echo 1234567890 > File    # 写字符串到"File".
97       exec 3<> File             # 打开"File"并且将fd 3分配给它.
98       read -n 4 <&3             # 只读取4个字符.
99       echo -n . >&3             # 写一个小数点.
100       exec 3>&-                 # 关闭fd 3.
101       cat File                  # ==> 1234.67890
102       # 随机访问.
103
104
105
106    |
107       # 管道.
108       # 通用目的处理和命令链工具.
109       # 与">", 很相似, 但是实际上更通用.
110       # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
111       cat *.txt | sort | uniq > result-file
112       # 对所有.txt文件的输出进行排序, 并且删除重复行.
113       # 最后将结果保存到"result-file"中.


command > filename      把标准输出重定向到一个新文件中

command >> filename      把标准输出重定向到一个文件中(追加)

command 1 > fielname      把标准输出重定向到一个文件中

command > filename 2>&1    把标准输出和标准错误一起重定向到一个文件中

command 2 > filename     把标准错误重定向到一个文件中

command 2 >> filename     把标准输出重定向到一个文件中(追加)

command >> filename 2>&1   把标准输出和标准错误一起重定向到一个文件中(追加)

command < filename >filename2   把command命令以filename文件作为标准输入,以filename2文件作为标准输出

command < filename    把command命令以filename文件作为标准输入

command << delimiter   把从标准输入中读入,直至遇到delimiter分界符

command <&m    把文件描述符m作为标准输入

command >&m    把标准输出重定向到文件描述符m中

command <&-    把关闭标准输入

2、exec用法总结

exec I/O重定向详解及应用实例

1、 基本概念(这是理解后面的知识的前提,请务必理解)

a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;

b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;

c、 用 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;

e、 0 是 与 1> 是一样的;

f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;

g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;

h、 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

i、 bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;

j、 ( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。

k、 exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。

2、cmd &n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出

&- 关闭标准输出

n&- 表示将 n 号输出关闭

上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:

... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。

... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)

我们对 2>&1详细说明一下 :2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的!

但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。

3、 如果 stdin, stdout, stderr 进行了重定向或关闭, 但没有保存原来的 FD, 可以将其恢复到 default 状态吗?

*** 如果关闭了stdin,因为会导致退出,那肯定不能恢复。

*** 如果重定向或关闭 stdout和stderr其中之一,可以恢复,因为他们默认均是送往monitor(但不知会否有其他影响)。如恢复重定向或关闭的 stdout: exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1。

*** 如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

4、 cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。

cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

我想:他们的不同点在于:

cmd >a 2>a 相当于使用了两个互相竞争使用文件a的管道;

而cmd >a 2>&1 只使用了一个管道,但在其源头已经包括了stdout和stderr。

从IO效率上来讲,cmd >a 2>&1的效率应该更高!

exec 0exec 1>outfilename # 打开文件outfilename作为stdout

exec 2>errfilename # 打开文件 errfilename作为 stderr

exec 0&- # 关闭 FD1

exec 5>&- # 关闭 FD5

总结一个表:

exec命令

作用

exec ls

在shell中执行ls,ls结束后不返回原来的shell中了

exec <file

将file中的内容作为exec的标准输入

exec >file

将file中的内容作为标准写出

exec 3<file

将file读入到fd3中

sort <&3

fd3中读入的内容被分类

exec 4>file

将写入fd4中的内容写入file中

ls >&4

Ls将不会有显示,直接写入fd4中了,即上面的file中

exec 5<&4

创建fd4的拷贝fd5

exec 3<&-

关闭fd3

1. exec 执行程序

虽然exec和source都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制。

举例说明:

root@localhost:~/test#exec ls

exp1 exp5 linux-2.6.27.54 ngis_post.sh test xen-3.0.1-install

<logout>

root@localhost:~/test#exec >text

root@localhost:~/test#ls

root@localhost:~/test#pwd

root@localhost:~/test#echo "hello"

root@localhost:~/test#exec>/dev/tty

root@localhost:~/test#cat text

exp1

exp5

linux-2.6.27.54

ngis_post.sh

test

text

xen-3.0.1-install

/root/test

hello

root@localhost:~/test#

Exec >text 是将当前shell的标准输出都打开到text文件中

root@localhost:~/test#cat test

ls

Pwd

root@localhost:~/test#bash

root@localhost:~/test#exec <test

root@localhost:~/test#ls

exp1 exp5 linux-2.6.27.54 ngis_post.sh test text xen-3.0.1-install

root@localhost:~/test#pwd

/root/test

root@localhost:~/test#

root@localhost:~/test#exit #自动执行

2. exec的重定向

先上我们进如/dev/fd/目录下看一下:

root@localhost:~/test#cd /dev/fd

root@localhost:/dev/fd#ls

0 1 2 255

默认会有这四个项:0是标准输入,默认是键盘。

1是标准输出,默认是屏幕/dev/tty

2是标准错误,默认也是屏幕

255

当我们执行exec 3>test时:

root@localhost:/dev/fd#exec 3>/root/test/test

root@localhost:/dev/fd#ls

0 1 2 255 3

root@localhost:/dev/fd#

看到了吧,多了个3,也就是又增加了一个设备,这里也可以体会下linux设备即文件的理念。这时候fd3就相当于一个管道了,重定向到fd3中的文件会被写在test中。关闭这个重定向可以用exec 3>&-。

root@localhost:/dev/fd#who >&3

root@localhost:/dev/fd#ls >&3

root@localhost:/dev/fd#exec 3>&-

root@localhost:/dev/fd#cat /root/test/te

test text

root@localhost:/dev/fd#cat /root/test/test

root tty1 2010-11-16 01:13

root pts/0 2010-11-15 22:01 (192.168.0.1)

root pts/2 2010-11-16 01:02 (192.168.0.1)

0

1

2

255

3

3. 应用举例:

exec 3<test

while read -u 3 pkg

do

echo "$pkg"

done
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: