进入命令的是输入,从命令出去的是输出。默认输入是从文件或键盘中,默认输出是打印到屏幕上。
通过重定向输入输出,我们可以调整输入数据的来源(文件或键盘),调整输出地点(屏幕或文件)。
3.5 数据重定向 - 图1
细分为三个输入输出流:

  1. 标准输入  (stdin) :代码为 0 ,使用 < 或 << ;
  2. 标准输出  (stdout):代码为 1 ,使用 > 或 >> ;
  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

    输出

    使用不同的符号重定向对应的流。>和>>的区别是,>>追加结果到目标文件,>是清空目标文件再添加。
分辨 > >>
共同点 目标文件不存在,会自动创建新的文件
不同点 清空,添加 追加

注意:一个命令的结果中可能包含多个流,如标准输出、错误输出。你配什么就起什么效果。
find / -name testing,包含二者。
image.png
因此如果想将错误的和正确的数据都存起来,需要进行两次重定向:
find /home -name .bashrc > list_right 2> list_error

黑洞和特殊写法

  • 丢掉某个流的数据/dev/nullfind /home -name .bashrc 2> /dev/null
  • 合并两个流到一个文件&1find /home -name .bashrc > list 2>&1,或者find /home -name .bashrc &> list

输入

取代键盘,从文件读取输入:cat > catfile < ~/.bashrc
<<:设定结束的输入字符cat > catfile << "eof",当键盘输入eof时,结束输入。
image.png

作用

保存运行结果,丢弃结果。

  • 屏幕输出的信息很重要,而且我们需要将他存下来的时候;
  • 背景运行中的程序,不希望他干扰屏幕正常的输出结果时;
  • 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的运行结果,希望他可以存下来时;
  • 一些运行命令的可能已知错误信息时,想以『 2> /dev/null 』将他丢掉时;
  • 错误信息与正确信息需要分别输出时。

命令运行逻辑

可以利用&&,||,;控制命令运行逻辑。

1. 运行多重命令;

sync; sync; shutdown -h now

2. $? (命令回传值) 与 && 或 ||

首先命令执行会有回传值$?:无异常$?=0,有异常不为0.因此可以用来进行命令的逻辑判断。
短路原则:
cmd1 || cmd2 :cmd1为True时,不做cmd2
cmd1 && cmd2 :cmd1为False时,不做cmd2
image.png
一些用法举例:

  • ls /tmp/abc || mkdir /tmp/abc:没有/tmp/abc时,创建/tmp/abc目录``
  • 创建/tmp/abc/hehe文件,如果父目录不存在自动创建:

ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

  • 类似三元运算符a?b:ccmd1 && cmd2 || cmd3,cmd1==true,执行cmd2,否则执行cmd3

如:ls /tmp/vbirding && echo "exist" || echo "not exist"


小知识:echo是打印命令,可以打印字符串,或者变量,变量需要用$引出。
举例:echo "exist" echo $PATH