前言:通常,我们会在终端输入一些命令,这些命令被系统处理了之后,系统又通过在终端显示的方式将输出结果呈现给我们,输入和输出都是终端;而重定向,就是指定输入/输出到某个文件,而不再是终端;
1.command > file
command是指一个命令,上面这个命令执行command然后将输出的内容存入file。
注意:任何file内的已经存在的内容将被新内容替代。
举例:
test.sh中有如下内容:
$ cat test.sh
:<<?
WOSHIHAODE
?
echo "我是ren"
现在执行这个命令:
$ ls > test.sh
执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。
再来看一下test.sh中的内容:
$ cat test.sh
Activity启动模式
adb命令
AMS数据结构
AS笔记
Linux笔记
Shell
Test
test.sh
Vi笔记
工作笔记
记录
开发笔记
再举一个例子:
$ echo "wo shi ren" > test.sh
$ cat test.sh
wo shi ren
从上面得知,输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾;
2.command >> file
将输出重定向追加到文件末尾,而不是覆盖文件内容,如:
$ cat test.sh
wo shi ren
$ echo "jintian shangban" >> test.sh
$ cat test.sh
wo shi ren
jintian shangban
3.command < file
1和2是输出重定向,现在看一下输入重定向,输入重定向指的是本来需要从键盘获取输入的命令会转移到文件读取内容。
先看看什么是键盘输入:
$ cat > test
testing
haha
$ cat test
testing
haha
由于加入>在cat之后,所以那个test文件会被主动创建,而内容就是刚才键盘上面输入的那两行数据了。那能不能用某个文件的内容来代替键盘的敲击呢?
~$ cat > test2 < test
~$ cat test2
testing
haha
可以看到,test2和test中的内容完全一致;
4.command < infile > outfile
执行command,从文件infile读取内容,然后将输出写入到outfile中。
5.n > file,n >& m,n <& m,n >> file,<< tag
n > file:将文件描述符为 n 的文件重定向到 file。
n >& m:将输出文件 m 和 n 合并。
n <& m:将输入文件 m 和 n 合并。
n >> file:将文件描述符为 n 的文件以追加的方式重定向到 file。
<< tag:将开始标记 tag 和结束标记 tag 之间的内容作为输入。
这个m,n是什么?
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
从标准输入文件读取数据,经过处理之后,再将标准输出文件或标准错误文件输出到屏幕上;
所以,m和n指的就是stdin,stdout 和stderr;
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
(1)如果希望 stderr 重定向到 file,可以这样写:
$ command 2 > file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2 >> file
注意:2 表示标准错误文件(stderr),错误文件的重定向是2>>,而正确文件的重定向是1>>,这个1可以省略,也就是>>;
(2)如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
或者
$ command >& file
(3)如果希望对 stdin 和 stdout 都重定向,可以这样写:
$ command < file >file
这个和上面的command < infile > outfile是相同的意思;
(4)将stdout 和 stderr 分别重定向到不同的 file:
~$ cat ./iei.sh > right 2> error
其中,right和error是两个文件,都cat ./iei.sh指令报错的时候,报错信息会被写到error中,如果指令正确,输出结果会被写到right文件中;
6.Here Document (重点注意)
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
它的基本的形式如下:
command << delimiter
document
delimiter
上面我们分析了>,>>,<的含义,却一直没有分析<<,因为>,>>,<代表了重定向,而<<表示结束输入的意思,它后面会接一个分隔符,也叫结束符;
delimiter表示分隔符,它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进;开始的delimiter前后的空格会被忽略掉。
举个例子:
$ cat test.sh
cat << EOF
今天是周一;
上班第一天;
哈哈
EOF
$ ./test.sh
今天是周一;
上班第一天;
哈哈
EOF是END Of File的缩写,表示自定义终止符,既然自定义,那么EOF就不是固定的,可以随意设置别名,如:
$ cat test.sh
cat << BB
今天是周一;
上班第一天;
哈哈
BB
$ ./test.sh
今天是周一;
上班第一天;
哈哈
将BB替换成EOF也是可以运行的,但是可读性较差,推荐写成EOF;
EOF一般是和cat一起用的,既然是一种特殊的重定向方式,那追加功能也是有的,如:
$ cat test.sh
cat << BB
今天是周一;
上班第一天;
哈哈
BB
$ cat >> test.sh <<EOF
> jin tian tian qi bu cuo
> xiang chu qu wan
> wq
> EOF
$ cat test.sh
cat << BB
今天是周一;
上班第一天;
哈哈
BB
jin tian bu buxiang shangban
jiahn
jin tian tian qi bu cuo
xiang chu qu wan
wq
以上的脚本命令是,在test.sh文件后面加上了几行代码。
7./dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1