标签:style http color io os 使用 ar 文件 数据
数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)!
什么是数据流重导向
命令运行过程如下:
运行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。
在上图当中, standard output 与 standard error output 分别代表『标准输出』与『标准错误输出』, 它们默认都是输出到屏幕!
标准输出指的是『命令运行所传回的正确信息』,而标准错误输出可理解为『 命令运行失败后,所传回的错误信息』。举个简单例子来说,我们的系统默认有 /etc/crontab 但却无 /etc/vbirdsay, 此时若下达『 cat /etc/crontab /etc/vbirdsay 』这个命令时,cat 会进行:
不管正确或错误的数据都是默认输出到屏幕上,所以屏幕显示的信息会很混乱!那能不能透过某些机制将这两股数据分开? 当然可以!那就是数据流重导向的功能!数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:
范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
[root@www ~]# ll / <==此时屏幕会显示出文件名信息
[root@www ~]# ll / > ~/rootfile <==屏幕并无任何信息
[root@www ~]# ll ~/rootfile <==有个新档被创建了!
-rw-r--r-- 1 root root 1089 Feb 6 17:00 /root/rootfile
|
原本『 ll / 』所显示的数据已经被重新导向到 ~/rootfile 文件中了! 那个 ~/rootfile 的档名可以随便你取。如果你下达『 cat ~/rootfile 』那就可以看到原本应该在屏幕上面的数据。 如果我再次下达:『 ll /home > ~/rootfile 』后,那个 ~/rootfile 文件的内容变成什么? 他将变成『仅有 ll /home 的数据』而已!原本的『 ll / 』数据就不见了!因为该文件的创建方式是:
如果我想要将数据累加而不想要将旧的数据删除,利用两个大于的符号 (>>)!以上面的范例来说,你应该要改成『 ll / >> ~/rootfile 』即可。 如此一来,当 (1) ~/rootfile 不存在时系统会主动创建这个文件;(2)若该文件已存在, 则数据会在该文件的最下方累加进去!
上面谈到的是 standard output 的正确数据,那如果是 standard error output 的错误数据呢?那就透过 2> 及 2>>!同样是覆盖 (2>) 与累加 (2>>) 的特性!我们在刚刚才谈到 stdout 代码是 1 而 stderr 代码是 2 , 所以这个 2> 是很容易理解的,而如果仅存在 > 时,则代表默认的代码 1 !也就是说:
要注意喔,『 1>> 』以及『 2>> 』中间是没有空格的! 当你以一般身份运行 find 这个命令的时候,由于权限的问题可能会产生一些错误信息。例如运行『 find / -name testing 』时,可能会产生类似『 find: /root: Permission denied 』之类的信息。 例如底下这个范例:
范例二:利用一般身份账号搜寻 /home 底下是否有名为 .bashrc 的文件存在
[root@www ~]# su - dmtsai <==假设我的系统有名为 dmtsai 的账号
[dmtsai@www ~]$ find /home -name .bashrc <==身份是 dmtsai 喔!
find: /home/lost+found: Permission denied <== Standard error
find: /home/alex: Permission denied <== Standard error
find: /home/arod: Permission denied <== Standard error
/home/dmtsai/.bashrc <== Standard output
|
运行『 find /home -name .bashrc > list 』, list 里面保存了刚刚那个『正确』的输出数据, 至于屏幕上还是会有错误的信息出现!
范例三:承范例二,将 stdout 与 stderr 分存到不同的文件去
[dmtsai@www ~]$ find /home -name .bashrc > list_right 2> list_error
|
此时『屏幕上不会出现任何信息』!
范例四:承范例三,将错误的数据丢弃,屏幕上显示正确的数据
[dmtsai@www ~]$ find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc <==只有 stdout 会显示到屏幕上, stderr 被丢弃了
|
将正确与错误数据通通写入同一个文件:
范例五:将命令的数据全部写入名为 list 的文件中
[dmtsai@www ~]$ find /home -name .bashrc > list 2> list <==错误
[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1 <==正确
[dmtsai@www ~]$ find /home -name .bashrc &> list <==正确
|
上述表格第一行错误的原因是,由于两股数据同时写入一个文件,又没有使用特殊的语法, 此时两股数据可能会交叉写入该文件内,造成次序的错乱。所以虽然最终 list 文件还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。 至于写入同一个文件的特殊语法如上表所示,你可以使用 2>&1 也可以使用 &> ! 一般来说,鸟哥比较习惯使用 2>&1 的语法!
『将原本需要由键盘输入的数据,改由文件内容来取代』
范例六:利用 cat 命令来创建一个文件的简单流程
[root@www ~]# cat > catfile
testing
cat file test
<==这里按下 [ctrl]+d 来离开
[root@www ~]# cat catfile
testing
cat file test
|
由于加入 > 在 cat 后,所以那个 catfile 会被主动的创建,而内容就是刚刚键盘上面输入的那两行数据了。:
范例七:用 stdin 取代键盘的输入以创建新文件的简单流程
[root@www ~]# cat > catfile < ~/.bashrc
[root@www ~]# ll catfile ~/.bashrc
-rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile
# 注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般!
|
[root@www ~]# cat > catfile << "eof"
> This is a test.
> OK now stop
> eof <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d
[root@www ~]# cat catfile
This is a test.
OK now stop <==只有这两行,不会存在关键词那一行!
|
:
[root@www ~]# sync; sync; shutdown -h now
|
两个命令之间有相依性,而这个相依性主要判断的地方就在于前一个命令运行的结果是否正确。
命令下达情况 | 说明 |
cmd1 && cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。 |
cmd1 || cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。 |
范例一:使用 ls 查阅目录 /tmp/abc 是否存在,若存在则用 touch 创建 /tmp/abc/hehe
[root@www ~]# ls /tmp/abc && touch /tmp/abc/hehe
ls: /tmp/abc: No such file or directory
# ls 很干脆的说明找不到该目录,但并没有 touch 的错误,表示 touch 并没有运行
[root@www ~]# mkdir /tmp/abc
[root@www ~]# ls /tmp/abc && touch /tmp/abc/hehe
[root@www ~]# ll /tmp/abc
-rw-r--r-- 1 root root 0 Feb 7 12:43 hehe
|
范例二:测试 /tmp/abc 是否存在,若不存在则予以创建,若存在就不作任何事情
[root@www ~]# rm -r /tmp/abc <==先删除此目录以方便测试
[root@www ~]# ls /tmp/abc || mkdir /tmp/abc
ls: /tmp/abc: No such file or directory <==真的不存在喔!
[root@www ~]# ll /tmp/abc
total 0 <==结果出现了!有进行 mkdir
|
范例三:我不清楚 /tmp/abc 是否存在,但就是要创建 /tmp/abc/hehe 文件
[root@www ~]# ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
|
由于Linux 底下的命令都是由左往右运行的,所以范例三有几种结果我们来分析一下:
整个流程图示如下:
例题:
以 ls 测试 /tmp/vbirding 是否存在,若存在则显示 "exist" ,若不存在,则显示 "not exist"!
答:
这又牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其他数据,那我可以这样做:
ls /tmp/vbirding && echo "exist" || echo "not exist"意思是说,当 ls /tmp/vbirding 运行后,若正确,就运行 echo "exist" ,若有问题,就运行 echo "not exist" !那如果写成如下的状况会出现什么? ls /tmp/vbirding || echo "not exist" && echo "exist"这其实是有问题的,为什么呢?由图 5.2.1 的流程介绍我们知道命令是一个一个往后运行, 因此在上面的例子当中,如果 /tmp/vbirding 不存在时,他会进行如下动作:
|
command1 && command2 || command3
而且顺序通常不会变,因为一般来说, command2 与 command3 会放置肯定可以运行成功的命令
标签:style http color io os 使用 ar 文件 数据
原文地址:http://www.cnblogs.com/ghgyj/p/3987373.html