Linux 之 Bash -- 数据流重导向

1.数据流重导向

数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据,给他传输到其他的地方。(在Linux的文本模式底下很重要)
我们借鸟哥的图理解一下 :STDIN(Standard input);STDOUT(Standard output);STDERR(Standard error output)


Linux 之 Bash -- 数据流重导向_第1张图片
指令执行过程的数据传输情况

standard output 即标准输出:指的是指令执行所回传的正确的讯息
standard error output 即标准错误输出:可以理解为“指令执行失败后,所回传的正确的讯息”

在这里插播一下find的用法
find + 路径 + '-name' +'file name' 就可以把指定路径下的具有此文件名的文件和其相对路径打印到屏幕上

来看一个数据流重导向的例子~
find /home -name .bashrc 翻译成人话就是 帮我找一下home路径下文件名为.bashrc的文件,然后打印出来
如果home路径下确实有.bashrc,那么输出即为标准输出1
如果home路径下没有.bashrc,那么输出即为标准输出2
除了考虑文件的存在性之外,还有一个问题:/home底下有你自己的账号,也有之前建立的其他人的账号啊,其他人账号的家目录你是没有权限进入的,因此肯定会出现一堆类似'find: /root: Permission denied'之类的讯息。
所以我们需要将stdout 与 stderr 分存到不同的文件去,才会使屏幕不那么乱。find /home -name .bashrc > list_right 2> list_error(注意:这里2和>之间是没有空格的)
这样的话数据就可以从 list_right 和 list_error里查看信息。
但是,如果我不想输出这些error信息,而是想让它们躺到类似Windows里的回收站里哩?
这里就要认识Linux的垃圾桶 /dev/null啦~
/dev/null可以吃掉任何导向这个装置的信息
就像这样:find /home -name .bashrc 2> /dev/null 把find过程中出现的error信息统统放到回收站去。
但是我如果想让STDOUT和STDERR都放到同一个文件呢?
我们在小白的认知层次上首先能想到的逻辑是这样的:
find /home -name .bashrc > list 2> list
这么做其实不会卡壳,也会有输出,只是erro信息会参差不齐得插入到list文本里,如果想让最后的结果看起来更整洁,还是使用特殊符号吧~
find /home -name .bashrc > list 2>&1 或者 find /home -name .bashrc &> list
这样就可以保证正确信息输出完毕后,再将过程中产生的erro信息统一增加到当前文本的最后面。

什么是standard input?(stdin)

  • < 将原本需要由键盘输入的数据,改由文件内容来取代
    例如 cat > catfile < ~/.bashrc 就是将~/.bashrc的内容输入到catfile中去(在类似mail这种指令的使用上非常有帮助)
  • << 代表的是“结束的输入字符”
    cat > catfile << "eof"情况下,可以直接在键盘输入eof代替“ctrl+d”来结束(~~呵呵,是不是很鸡肋~~)

2.教你一次执行多个指令(符号版本)

一次性执行多项任务,最方便的就是撰写脚本去执行,额~,这就要学习shell script啦,panda还不会,期待有伙伴们多多评论,多多鼓励,我们一起把这个专题学下去~

2.1 使用分号;

指令和指令中间用分号;来隔开,分号前的指令执行完后就会立刻执行后面的指令,即command1;command2这种形式
特点:前面的command1执行完成后就会立刻执行command2,所以使用时存在一定局限性

2.2 使用判断符号 &&||

它们是根据 指令回传值 来确定后面的命令是否要继续执行的
指令回传值$?
如果前一个指令执行的结果为正确,在Linux底下会回传一个$?=0的值
&& 和 || 就是根据指令回传值判断command2是否执行的

下面 command 简写为 cmd

Linux 之 Bash -- 数据流重导向_第2张图片
&& 和 || 的应用

linux最怕纸上谈兵了,panda下面列了9张图,共4步小操作,在实操中认识 &&||,不要偷懒~

  • step1.确保该目录下没有名为file的目录
    这里使用ls判断目录是否存在,从而获得Linux的指令回传值:如果存在,Linux的指令回传值$?=0;反之则不为0(这个回传值不会直接输出到屏幕上)
    确保该目录里没有file这个目录
  • step2. 作瞎得玩玩&&
    通过前面知道,&&后面的command只有在前面的指令回传值$?=0时才能被执行,因此ls file && mkdir file(当前目录下是没有file目录的)是一条无效的指令
    &&测验

    由于command1的指令回传值非0,因此无法执行mkdir file,ls file也就显示没有该目录
    验证 ls file && mkdir file 是否执行
  • step3. 试试||
    ls file || mkdir file
    由于该目录下没有file目录,因此前一个命令的指令回传值不为0,从而执行mkdir file
    ls file || mkdir file

    通过tree指令可以查看目录结构,可以看到command2执行操作了
    tree查看file目录
  • step4. &&||一起用
    ls file || mkdir file && mkdir file/filename
    由于当前目录不存在/file,ls file指令回传值$?不为0,从而执行mkdir file(指令回传值为0);然后,继续执行mkdir file/filename
    在当前目录下创建/file/filename

    tree查看一下file,发现已经成功创建 file/filename
    tree查看file目录

由于指令是一个接着一个去执行的,因此,如果真要使用判断,那么这个&&||的顺序就不能搞错,一般来说假设判断式有3个: command 1 && command 2 || command 3,而且顺序通常不会变,因为一般来说,command2与command3会放置肯定可以执行成功的指令。

好啦,关于Linux的数据流重导向就这么多了,明后天写一下管线命令

postscript:
“我才不管有没有file这个目录,我就是要创建/file/filename”可以这么试试
ls file && mkdir file/filename || mkdir file && mkdir file/filename
想看一下执行后的结果?tree file试试~

你可能感兴趣的:(Linux 之 Bash -- 数据流重导向)