进入命令的是输入,从命令出去的是输出。默认输入是从文件或键盘中,默认输出是打印到屏幕上。
通过重定向输入输出,我们可以调整输入数据的来源(文件或键盘),调整输出地点(屏幕或文件)。
细分为三个输入输出流:
- 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
- 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
- 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
输出
使用不同的符号重定向对应的流。>和>>的区别是,>>追加结果到目标文件,>是清空目标文件再添加。
分辨 | > | >> |
---|---|---|
共同点 | 目标文件不存在,会自动创建新的文件 | |
不同点 | 清空,添加 | 追加 |
注意:一个命令的结果中可能包含多个流,如标准输出、错误输出。你配什么就起什么效果。
如find / -name testing
,包含二者。
因此如果想将错误的和正确的数据都存起来,需要进行两次重定向:find /home -name .bashrc > list_right 2> list_error
黑洞和特殊写法
- 丢掉某个流的数据
/dev/null
:find /home -name .bashrc 2> /dev/null
- 合并两个流到一个文件
&1
:find /home -name .bashrc > list 2>&1
,或者find /home -name .bashrc &> list
输入
取代键盘,从文件读取输入:cat > catfile < ~/.bashrc
<<:设定结束的输入字符cat > catfile << "eof"
,当键盘输入eof时,结束输入。
作用
保存运行结果,丢弃结果。
- 屏幕输出的信息很重要,而且我们需要将他存下来的时候;
- 背景运行中的程序,不希望他干扰屏幕正常的输出结果时;
- 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的运行结果,希望他可以存下来时;
- 一些运行命令的可能已知错误信息时,想以『 2> /dev/null 』将他丢掉时;
- 错误信息与正确信息需要分别输出时。
命令运行逻辑
1. 运行多重命令;
2. $? (命令回传值) 与 && 或 ||
首先命令执行会有回传值$?
:无异常$?=0
,有异常不为0.因此可以用来进行命令的逻辑判断。
短路原则:
cmd1 || cmd2 :cmd1为True
时,不做cmd2
cmd1 && cmd2 :cmd1为False
时,不做cmd2
一些用法举例:
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:c
:cmd1 && cmd2 || cmd3
,cmd1==true,执行cmd2,否则执行cmd3
如:ls /tmp/vbirding && echo "exist" || echo "not exist"
小知识:echo是打印命令,可以打印字符串,或者变量,变量需要用$引出。
举例:echo "exist"
echo $PATH