Linux学习资料-命令重导向

命令重导向
基本上,这个子题是 bash 相当重要的观念,这里可得花点心思才行呦!
什么是『重导向, redirect ?』:简单的说,就是将你目前的所得资料转到其它地方去就是了!例如我们常用的,将目前的屏幕输出数据转到档案中去,就可以这么写:『ls -l / > test 』,那个大于的符号『 > 』就是将输出结果导向到 test 这个档案中的意思啰!这个时候:
如果你执行『 ls -l / 』而已的话,屏幕会将根目录的档案与目录都列出在屏幕上;
但是当使用 > 导向到 test 这个档案中时,则屏幕不会显示任何讯息,但是会将刚刚你执行的结果输出到 test 这个档案中。
所以啰,你只要『 vi test 』一下,就会知道 test 这个档案中记录了刚刚我们执行的数据结果啰!不过,这里需要特别留意的是,当你使用 > 符号将数据由屏幕导向到档案中时,则:
该档案(就是 test )若不存在,系统会自动的将他建立起来,但是,
当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将数据写入!
也就是若以 > 输出到一个既存盘案中,呵呵,那个档案就会被覆盖掉啰!
除了这个 > 的符号之外,在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>
基本的指令书写方式为:
  指令 1>
1>>
2>
2>>
< 装置或档案

左边一定是指令,至于右边则可能是装置或者是档案!注意了!那个 1> 与 2> 之间并没有空格符!而相关的使用说明可以举例如下:
  [test @test test]# ls -al >  list.txt 
将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代!
[test @test test]# ls -al >> list.txt 
将显示的结果累加到 list.txt 档案中,该档案为累加的,旧数据保留!
[test @test test]# ls -al 1> list.txt 2> list.err 
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err
[test @test test]# ls -al 1> list.txt 2>&1 
将显示的数据,不论正确或错误均输出到 list.txt 当中!
[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃!
注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!
不能写成其它格式!

这个观念相当的重要,尤其是在 /etc/crontab 当中执行的时候,如果我们已经知道错误的讯息为何,又不想要让错误的讯息一直填满 root 的信箱,就必须以 2> 搭配 /dev/null 这个垃圾桶黑洞装置,来将数据丢弃!这个相当的重要!

这里我们来说明一下命令重导向里面几个常用的符号与装置:
<  :由 < 的右边读入参数档案;
>  :将原本由屏幕输出的正确数据输出到 > 右边的 file ( 文件名称 ) 或 device ( 装置,如 printer )去;
>> :将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的数据将以『增加的方式』增加到该档案的最后面;
2> :将原本应该由屏幕输出的错误数据输出到 2> 的右边去。
/dev/null :可以说成是黑洞装置!
好了,对于『 > , >> 』这两个东西有一定的概念之后,我们来深入的谈一谈『命令输出重导向』的观念吧!如前所述,基本上, Linux 执行的结果中,可以约略的分成『正确输出』与『错误输出』两种方式。例如,当你以一般身份执行 find 这个指令时,例如执行『 find / -name testing 』时,由于你是一般身份,又有些数据夹是不允许一般身份者进入的,所以啰,当你使用 find 时,就会有错误讯息发生了!但同时如果有 testing 这个档案在你可以进入的资料夹当中,那么屏幕也会输出到给你看!因此,就具有正确的与错误的输出两种啰!(分别称为 Stdout 与 Stderror)例如下面为执行结果:里面的『 find: /home/root: Permission denied 』就告诉你该数据夹你没有权限进入,这就是错误的输出了,那么『 /home/test/tseting 』就是正确的输出了!
  [test @test test]# find / -name testing
find: /home/test1: Permission denied    <==这是错误的输出
find: /home/root: Permission denied       <==这是错误的输出
find: /home/masda: Permission denied      <==这是错误的输出
/home/test/testing                        <==这是『正确』的输出
[test @test test]#

好了,那么假如我们想要将数据输出到 list 这个档案中呢?执行『 find / -name testing > list 』会有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出数据,至于屏幕上还是会有错误的讯息出现呢!伤脑筋!如果想要将正确的与错误的数据分别存入不同的档案中需要怎么做?!呵呵!其实在数据的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进行数据的!那个 1> 是输出正确数据, 2> 则是错误数据输出项目。也就是说:

1> :是将正确的数据输出到指定的地方去
2> :是将错误的数据输出到指定的地方去
好了,那么上面的例子中,我们如何将数据输出到不同的地方去呢?可以这么写:
  [test @test test]# find / -name testing 1> list_right 2> list_error

这样一来,刚刚执行的结果中,有 Permission 的那几行错误信息都会跑到 list_error 这个档案中,至于正确的输出数据则会存到 list_right 这个档案中啰!这样可以了解了吗?如果有点混乱的话,去休息一下再来看看吧!!

再来,如果我只要正确的数据,错误的信息我不要了呢?呵呵,这个时候 /dev/null 这个垃圾桶就很重要了!/dev/null 是什么呢?基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向到这个虚拟的垃圾桶装置时,『他就会凭空消失不见了~~』,这个东西有用的很!例如上面的例子中,我们可以这么做,来将错误的信息丢掉!
  [test @test test]# find / -name testing 1> list_right 2> /dev/null

很神奇呦! error message 就会『不见了!』呵呵!真高兴!另外,如果我要将数据都写到同一个档案中呢?这个时候写法需要用到特殊写法,请注意底下的写法呦!
  [test @test test]# find / -name testing 1> list 2> list<==错误写法
[test @test tset]# find / -name testing 1> list 2>&1   <==正确写法

请特别留意这一点呢!同时写入同一个档案需要使用 2>&1 才对呦!

OK!了解了 >, 2>, >> 与 /dev/null 之后,那么那个 < 又是什么呀!?呵呵!以最简单的说法来说,那就是『将原本需要由键盘输入的数据,经由档案来读入』的意思,最明显的例子就是 mail 这个东西了!我们以 root 的身份来寄信给 root 好了,可以这样做:
  1. 完全由键盘输入数据:
[root @test test]# mail -s "test" root <== -s 表示标题, root 为收件者
I am root! <==以下的数据都是由键盘输入的
That‘s OK
.       <==要结束键盘的输入时,需要在一行的最前面加上 . 即可!
CC.     <==是否需要有密件副本?不需要的话,直接按下 Enter !
EOF     <==表示送出的提示字符而已!
2. 由档案代替输入
[test @test tset]# mail -s "test" root < /root/.bashrc <==将 .bashrc 内容寄给 root !

很有趣吧! ^_^ 这样就可以将信寄出去啰!所以说,熟悉命令重导像的话,对您可是相当的有帮助的呦!

好了,那么为何要使用命令输出重导向呢?这个问题一定会困扰你一下下的,如果你从来都没有写过 script 的话!好了,我们来说一说吧!
当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时;
一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
错误讯息与正确讯息需要分别输出时。
当然还有很多很多的功能的,最简单的就是网友们常常问到的:『为何我的 root 都会收到系统 crontab 寄来的错误讯息呢』这个咚咚是常见的错误,而如果我们已经知道这个错误讯息是可以忽略的时候,嗯!『 2> errorfile 』这个功能就很重要了吧!了解了吗??

时间: 2024-08-24 02:11:35

Linux学习资料-命令重导向的相关文章

Linux学习资料-管线命令 ( pipe )

管线命令 ( pipe ) 就如同前面所说的, bash 命令执行的时候有输出的数据会出现!那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!另外,管线命令与『连续下达命令』是不一样的呦!这点底下我们会再说明.底下我们先举一个例子来说明一下简单的管线命令. 假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?注意呦!我们只需要『次数』.那么我所进行的步骤是

Linux学习资料整理

Shell Linux Shell脚本教程:30分钟玩转Shell脚本编程 Bash Shell字符串操作小结 vi vim使用 vi.vim删除以及其他命令 Vim静态模板文件 打造自己的vim界面 命令 linux中grep命令的用法 linux之sort用法 gawk gawk手册 Common threads: Awk by example, Part 1 sed sed命令用法详解 Linux学习资料整理

linux学习资料持续更新中

一.LINUX基础教程 1.老男孩系列免费视频: 1) linux高薪入门实战视频教程(第二部)老男孩linux教程 http://edu.51cto.com/course/course_id-1035-page-1.html 2) 跟着老男孩从0开始一步步实战深入学习linux运维(三) http://edu.51cto.com/lesson/id-11909.html linux学习资料持续更新中,布布扣,bubuko.com

Linux学习资料-scp命令

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来.另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了.虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用. 1.命

linux学习-常规命令使用5

inode定义 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).这种由多个扇区组成的"块",是文件存取的最小单位."块"的大小,最常见的是4KB,即连续八个 sector组成一个 block. 文件数据都

第十一章、认识与学习 BASH 数据流重导向

数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据传输情况 运行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上. 在上图当中, standard output 与 standard error output 分别代表『标准输出』与『标准错误输出』, 它们默认都是输出到屏幕! standard output 与 st

linux 学习之命令总结(二)

下列是linux 学习中一些用户管理类常用命令: 1:命令useradd 命令格式: useradd [OPTIONS]login 常用功能: 创建用户 常用参数: -r:创建系统用户 -u:指定uid -g:指定用户所属基本组,此组必须事先存在 -d:(/PATH/TO/SOMEWHERE),指定用户的主目录路径,此位置不能事先存在,否则,用户相关配置文件被复制/ETC/SKEL -s:设置用户的默认shell -G:指定用户的副加组 -M:不给用户创建家目录 例: 2:命令groupadd

Linux学习资料-more命令详解

more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 .more命令从前向后读取文件,因此在启动时就加载整个文件. 1.命令格式: more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 2.命令功能: more命令和cat的功能一样都

Linux学习之命令行获取公网IP方法详解

本文和大家分享的主要是主要是linux命令行获取公网IP相关内容,一起来看看吧,希望对大家学习linux有所帮助. curl ipinfo.io $ curl ipinfo.io { "ip": "36.10.25.4", "city": "Hangzhou", "region": "Zhejiang", "country": "CN", &quo